养浩然之气,做博学之人
策略模式(Strategy Pattern)也称政策模式,是一种可以在运行时选择算法的模式,存在多种不同的算法(每一种对应一个单独的类,每个类的功能不同)。策略模式的重心不是如何实现算法,而是如何组织、调用这些算法,从而让程序结构更灵活,具有更好的维护性和扩展性。所有的策略算法在实现上也是相互独立的,相互之间是没有依赖的。
类型:行为型模式
主要解决:在有多种算法相似的情况下,使用 if...else 所带来的复杂和难以维护。存在多种解决方案的问题。
具体方案:将这些算法封装成一个一个的类,任意地替换。实现同一个接口。
应用实例:
1、诸葛亮的锦囊妙计,每一个锦囊就是一个策略。
2、旅行的出游方式,选择骑自行车、坐汽车,每一种旅行方式都是一个策略。
3、JAVA AWT 中的 LayoutManager。
4、商场搞促销,促销的方式有可能有很多:打折;满减,积分返利等。
5、对数据排序,可选:冒泡排序,选择排序。。。等多种选择
6、准考证生成模式:9位,11位等不同方案。
优点: 1、算法可以自由切换。 2、避免使用多重条件判断。 3、扩展性良好。
缺点: 1、策略类会增多。 2、所有策略类都需要对外暴露。
公有行为的处理:经常见到的是,所有的具体策略类都有一些公有的行为。这时候,就应当把这些公有的行为放到共同的抽象策略角色Strategy类里面。当然这时候抽象策略角色必须要用Java抽象类实现,而不能使用接口。这其实也是典型的将代码向继承等级结构的上方集中的标准做法。
注意事项:如果一个系统的策略多于四个,就需要考虑使用混合模式,解决策略类膨胀的问题。
实现:创建 Strategy 接口和实现了 Strategy 接口的实体策略类。
具体实现:
抽象策略类:通常由一个接口或者抽象类实现。定义一个所有算法都支持的通用接口,内容类会通过这个接口来调用由具体策略定义的各个方法。
public interface Strategy { public void strategyInterface(); }
具体策略类:每个具体策略都会实现相应的算法
public class ConcreteStrategyA implements Strategy { @Override public void strategyInterface() { //A策略相关的业务 } } public class ConcreteStrategyB implements Strategy { @Override public void strategyInterface() { //B策略相关的业务 } } public class ConcreteStrategyC implements Strategy { @Override public void strategyInterface() { //C策略相关的业务 } }
环境角色类(内容类/上下文):内容类包含对将要使用的具体策略对象的引用,内容类接收来自客户端的请求,并将其委托给策略类对象,通常具体的策略类由客户端创建,并传递给内容类。
public class Context { //持有一个具体策略的对象 private Strategy strategy; /** * 构造函数,传入一个具体策略对象 * @param strategy 具体策略对象 */ public Context(Strategy strategy){ this.strategy = strategy; } /** * 策略方法 */ public void contextInterface(){ strategy.strategyInterface(); } }
参考:《JAVA与模式》《设计模式精解与面试攻略》
编辑:孙小北
本文地址: https://www.xiaowangyun.com/wyblog/detail/?id=183
版权归属: www.xiaowangyun.com 转载时请以链接形式注明出处
0 条评论