概述
策略模式(Strategy Pattern)的思想是在程序运行时动态改变某一个类的执行逻辑,属于一种行为型设计模式。目的是为了尽可能的减少if...else代码。它的核心在于”选择“两个字,每一种选择就是一个策略。通常情况下,在选择不多的时候,我们采用的是if...else代码块来实现。但是这种方式的扩展性不强,每次增加一种选择就需要修改该if...else的源码,违反了开闭原则。况且一旦if...else多了起来可读性也会变差。所以在开发中遇到”多种选择“时,可以优先考虑一下策略模式。
使用场景
- 如:中午吃什么?米饭,面,粉等等,每一个选择就是一种策略
- 旅游出行时,选择什么样的交通工具。飞机、高铁、地铁
如何实现
- 所有的策略实现类有一个顶层接口Strategy,接口中定义了一个执行逻辑方法
- 策略实现类实现Strategy接口,编写自己的执行逻辑
- 维护一个Context类,这个类的执行逻辑是可变的,每当它的策略发生改变时,其运行结果也会发生改变
代码示例
策略接口及实现类
public interface TravelStrategy {
String doOperation();
}
public class Airplane implements TravelStrategy {
@Override
public String doOperation() {
return "飞机";
}
}
public class HighSpeedRail implements TravelStrategy {
@Override
public String doOperation() {
return "高铁";
}
}
public class Subway implements TravelStrategy {
@Override
public String doOperation() {
return "地铁";
}
}
可动态改变执行策略的类
public class MyTravelContext {
public String executeStrategy(TravelStrategy travelStrategy) {
return "出门旅游坐啥好: " + travelStrategy.doOperation();
}
}
测试
public class TestStrategy {
public static void main(String[] args) {
MyTravelContext context = new MyTravelContext();
System.out.println(context.executeStrategy(new Airplane()));
System.out.println(context.executeStrategy(new HighSpeedRail()));
System.out.println(context.executeStrategy(new Subway()));
}
}
运行结果
出门旅游坐啥好: 飞机
出门旅游坐啥好: 高铁
出门旅游坐啥好: 地铁
框架源码中的应用
- spring框架中的ObjectNamingStrategy类,获取bean的beanName
总结
优点
- 扩展性好
- 运行时自由切换执行逻辑
- 减少if...else代码
缺点
- 策略过多时会产生大量的类
- 所有策略类都需要暴露给使用者