定义
- 定义了算法家族,分别封装起来,让他们之间可以相互替换,此模式让算法的变化不会影响到使用算法的用户。可以理解成:将不同的算法封装到不同的类中,让他们可以相互替换
- 隶属于行为型设计模式
应用场景
- 系统有很多类,而它们的区别仅仅在于行为不同
- 一个系统需要动态的选择算法中的一种
优点
- 对行为有很好的扩展,符合开闭原则
- 避免了多重条件语句
- 提高算法的保密和安全性
缺点
- 客户端必须知道所有的策略类,并自行决定使用哪一种
- 产生很多策略类
示例代码
/*** 策略模式,定义一个算法家族,分别封装起来,让他们之间可以相互替换,此模式让算法的变化不会影响到算法的使用。* Strategy类 定义所有支持算法的公共接口*/public abstract class Strategy {// 算法方法public abstract void algorithmInterface();}
/*** 用一个ConcreteStrategy 来配置,维护一个对Strategy 引用*/public class Context {private final Strategy strategy;/*** @param strategy 在初始化是传入具体的策略(strategy)*/public Context(Strategy strategy) {this.strategy = strategy;}/*** 根据具体的策略对象,调用其算法的方法*/public void contextInterface() {strategy.algorithmInterface();}}
/*** 具体的算法,继承Strategy*/public class ConcreteStrategyA extends Strategy {@Overridepublic void algorithmInterface() {System.out.println("算法A");}}
客户端代码
public class Main {// 客户端代码public static void main(String[] args) {Context context = new Context(new ConcreteStrategyA());// 执行指定策略的算法逻辑context.contextInterface();}}
策略模式解析
策略模式是一种定义一系列算法的方法,所有的算法完成都是相同的工作,但是实现不同,他可以以相同的方式调用所有的算法,减少了各种算法类与使用算法类之间的耦合。在客户端中判断用那一种算法计算使用了switch分支,当不同的行为堆砌在在一个类中时,就很难避免使用条件语句来选择合适的行为,将这些行为封装在一个个独立的Strategy类中,可以在使用这些行为的类中消除条件语句。
