策略模式是属于设计模式中的行为模式中的一种,策略模式主要解决选项过多的问题,避免大量的if else 和 switch下有太多的case。
策略模式的重心不是如何实现算法,而是如何组织、调用这些算法,从而让程序结构更灵活,具有更好的维护性和扩展性@mikechen
策略模式的定义
策略(Strategy)模式:该模式定义了一系列算法,并将每个算法封装起来,使它们可以相互替换,且算法的变化不会影响使用算法的客户。
策略是个形象的表述,所谓策略就是方案,日常生活中,要实现目标,有很多方案,每一个方案都被称之为一个策略。
打个比方说,我们出门的时候会选择不同的出行方式,比如骑自行车、坐公交、坐火车、坐飞机、坐火箭等等,这些出行方式,每一种都是一个策略。
再比如我们去逛商场,商场现在正在搞活动,有打折的、有满减的、有返利的等等,其实不管商场如何进行促销,说到底都是一些算法,这些算法本身只是一种策略,并且这些算法是随时都可能互相替换的,比如针对同一件商品,今天打八折、明天满100减30,这些策略间是可以互换的。
在软件开发中也常常遇到类似的情况,实现某一个功能有多个途径,此时可以使用一种设计模式来使得系统可以灵活地选择解决途径,也能够方便地增加新的解决途径,这就是策略模式。
策略模式的结构
这个模式涉及到三个角色:
1.环境(Context)角色
持有一个策略类的引用,提供给客户端使用。
2.抽象策略(Strategy)角色
这是一个抽象角色,通常由一个接口或抽象类实现,此角色给出所有的具体策略类所需的接口。
3.具体策略(ConcreteStrategy)角色
实现了抽象策略定义的接口,包装了具体的算法或行为。
策略模式的实现
1.创建抽象策略类
package com.mikechen.java.design.strategy; /** * 抽象策略类 * * @author mikechen */ public interface Strategy { /** * 策略方法 */ public void strategyInterface(); }
2.创建具体策略
1)具体策略A
package com.mikechen.java.design.strategy; /** * 具体策略A * * @author mikechen */ public class ConcreteStrategyA implements Strategy { @Override public void strategyInterface() { System.out.println("执行策略A"); } }
2)具体策略B
package com.mikechen.java.design.strategy; /** * 具体策略B * * @author mikechen */ public class ConcreteStrategyB implements Strategy { @Override public void strategyInterface() { System.out.println("执行策略B"); } }
3.创建环境类
package com.mikechen.java.design.strategy; /** * 环境类 * * @author mikechen */ public class Context { //持有一个具体策略的对象 private Strategy strategy; /** * 构造函数,传入一个具体策略对象 * @param strategy 具体策略对象 */ public Context(Strategy strategy){ this.strategy = strategy; } /** * 策略方法 */ public void contextInterface(){ strategy.strategyInterface(); } }
策略模式的优缺
1.优点
- 算法可以自由切换
- 避免使用多重条件判断(如果不用策略模式我们可能会使用多重条件语句,不利于维护)
- 扩展性良好,增加一个策略只需实现接口即可
2.缺点
- 策略类数量会增多,每个策略都是一个类,复用的可能性很小
- 所有的策略类都需要对外暴露
策略模式的应用场景
- 多个类只有算法或行为上稍有不同的场景
- 算法需要自由切换的场景
- 需要屏蔽算法规则的场景
- 出行方式,自行车、汽车等,每一种出行方式都是一个策略
- 商场促销方式,打折、满减等
陈睿mikechen
10年+大厂架构经验,资深技术专家,就职于阿里巴巴、淘宝、百度等一线互联网大厂。
关注「mikechen」公众号,获取更多技术干货!
后台回复【面试】即可获取《史上最全阿里Java面试题总结》,后台回复【架构】,即可获取《阿里架构师进阶专题全部合集》