1. 定义
定义了一系列算法族,分别被封装起来,可以相互替换,该模式使得算法的变化独立于客户对其的使用。
2. 角色
- Context:环境类,调用算法的用户
- Strategy:抽象策略类。
- ConcreteStrategy:具体策略类,每个类封装的算法有所不同。
3. 特点
- 优点:算法的选择交由用户决定,增加了系统的灵活性。
- 缺点:用户需要知道所有算法的不同点以便选择合适的算法,增加了用户使用的难度。
4. 示例
Strategy:
public interface Strategy {
public void algorithm();
}
具体策略类:
// ConcreteStrategyA
public class ConcreteStrategyA implements Strategy {
@Override
public void algorithm() {
System.out.println("this is strategy A");
}
}
// ConcreteStrategyB
public class ConcreteStrategyB implements Strategy {
@Override
public void algorithm() {
System.out.println("this is strategy B");
}
}
Context:
public class Context {
Strategy strategy;
public void algorithm() {
strategy.algorithm();
}
public void setStrategy(Strategy strategy) {
this.strategy = strategy;
}
}
测试类:
public class TestStrategy {
public static void main(String[] args) {
Context context = new Context();
Strategy strategyA = new ConcreteStrategyA();
Strategy strategyB = new ConcreteStrategyB();
context.setStrategy(strategyA);
context.algorithm();
System.out.println("-------------------");
context.setStrategy(strategyB);
context.algorithm();
}
}
// 输出
// this is strategy A
// -------------------
// this is strategy B
参考:
1. 《Head First 设计模式》
2. 《图说设计模式》https://design-patterns.readthedocs.io/zh_CN/latest/behavioral_patterns/strategy.html