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