目录
0、定义
定义一系列算法,把它们一个个封装起来,并且使它们可相互替换。本模式使得算法可独立于使用它的客户而变化。
1、策略模式的三种角色
- 策略(Strategy):策略是一个接口,该接口定义若干个算法标识,即定义了若干个抽象方法。
- 具体策略(concreteStrategy):具体策略是实现策略接口的类。具体策略实现策略接口所定义的抽象方法,即给出算法标识的具体算法。
- 上下文(Context):上下文是依赖于策略接口的类,即上下文包含有策略声明的变量。上下文中提供一个方法,该方法委托策略变量调用具体策略所实现的策略接口中的方法。
2、策略模式的UML类图
3、示例代码
策略:
package xyz.jangle.design.strategy;
public interface Strategy {
public void algorithm();
}
具体策略A
package xyz.jangle.design.strategy;
public class ConcreteStrategyA implements Strategy {
@Override
public void algorithm() {
System.out.println("这是方法A");
}
}
具体策略B
package xyz.jangle.design.strategy;
public class ConcreteStrategyB implements Strategy {
@Override
public void algorithm() {
System.out.println("这是方法B");
}
}
上下文
package xyz.jangle.design.strategy;
public class Context {
private Strategy strategy;
public Context(Strategy strategy) {
super();
this.strategy = strategy;
}
public void setStrategy(Strategy strategy) {
this.strategy = strategy;
}
public void lookAlgorithm() {
strategy.algorithm();
}
}
客户端(使用)
package xyz.jangle.design.strategy;
public class AppMain7 {
public static void main(String[] args) {
ConcreteStrategyA strategyA = new ConcreteStrategyA();
Context context = new Context(strategyA); // 注入策略A
context.lookAlgorithm();
System.out.println("-------------");
context.setStrategy(new ConcreteStrategyB()); // 注入策略B
context.lookAlgorithm();
}
}
执行结果:
这是方法A
-------------
这是方法B