策略模式定义了一系列算法, 并将每个算法封装起来, 使它们可以相互替换, 算法的变化不会影响到使用算法的用户.

策略模式结构

  • 抽象策略类: 定义所有支持的算法的公共接口
  • 具体策略类: 实现策略接口的具体算法
  • 上下文类: 持有一个策略类的引用, 通过策略接口调用具体策略类的方法

策略模式实现

假设一家商店在不同的节日推出不同的促销活动, 由推销员将活动展示给客户.

public interface Strategy {
void show();
}

public class StrategyA extends Strategy {
void show() {
System.out.println("买一送一");
}
}

public class StrategyB extends Strategy {
void show() {
System.out.println("满100减20");
}
}

public class SalesMan {
private Strategy strategy;

public SalesMan(Strategy strategy) {
this.strategy = strategy;
}

public void setStrategy(Strategy strategy) {
this.strategy = strategy;
}

public void salesManShow() {
strategy.show();
}
}

public class Client {
public static void main(String[] args) {
Strategy strategyA = new StrategyA();
Strategy strategyB = new StrategyB();

SalesMan salesMan = new SalesMan(strategyA);
salesMan.salesManShow();
System.out.println();
salesMan.setStrategy(strategyB);
salesMan.salesManShow();
}
}

优点:

  • 策略类之间可以自由切换. 因为策略类都实现了一个接口, 所以他们可以自由切换
  • 易于拓展. 增加新的策略只需要添加一个具体的策略类, 基本不需要改变原有的代码
  • 避免使用了多重条件选择语句, 充分体现了面向对象思想

缺点:

  • 客户端必须知道所有的策略类, 并自行决定使用所有的策略类
  • 策略模式会产生很多策略类, 可以通过享元模式在一定程度上减少对象的数量