什么是策略模式?
提前指定一系列的策略,程序运行时选择性执行的模式叫策略模式。
该模式定义了一系列算法,并将每个算法封装起来,使它们可以相互替换,且算法的变化不会影响使用算法的客户。策略模式属于对象行为模式,它通过对算法进行封装,把使用算法的责任和算法的实现分割开来,并委派给不同的对象对这些算法进行管理。
适用场景
在有多种算法相似的情况下,使用 if…else 所带来的复杂和难以维护。
1、诸葛亮的锦囊妙计,每一个锦囊就是一个策略。
2、旅行的出游方式,选择骑自行车、坐汽车,每一种旅行方式都是一个策略。
3、Spring MVC框架中每个路由可以看成一个策略
代码实现
策略模式的主要角色如下。
- 抽象策略(Strategy)类:定义了一个公共接口,各种不同的算法以不同的方式实现这个接口,环境角色使用这个接口调用不同的算法,一般使用接口或抽象类实现。
- 具体策略(Concrete Strategy)类:实现了抽象策略定义的接口,提供具体的算法实现。
- 环境(Context)类:持有一个策略类的引用,最终给客户端调用。
/**
* 抽象策略类
*/
interface Strategy {
//策略方法
void method();
}
/**
* 具体策略类A
*/
class ConcreteStrategyA implements Strategy {
@Override
public void method() {
System.out.println("具体策略A的策略方法");
}
}
/**
* 具体策略类B
*/
class ConcreteStrategyB implements Strategy {
@Override
public void method() {
System.out.println("具体策略B的策略方法");
}
}
/**
* 上下文 环境类
*/
class Context {
private Strategy strategy;
public Strategy getStrategy() {
return strategy;
}
public void setStrategy(Strategy strategy) {
this.strategy = strategy;
}
public void strategyMethod() {
strategy.method();
}
}
/**
* 策略模式 测试类
*/
public class StrategyPattern {
public static void main(String[] args) {
//创建上下文
Context context = new Context();
//使用策略A
Strategy strategyA = new ConcreteStrategyA();
context.setStrategy(strategyA);
context.strategyMethod();
//使用策略B
Strategy strategyB = new ConcreteStrategyB();
context.setStrategy(strategyB);
context.strategyMethod();
//输出:
//具体策略A的策略方法
//具体策略B的策略方法
}
}