设计模式 22 策略模式
策略模式(Strategy Pattern)属于行为型模式
概述
生活中会面临很多抉择,每一个抉择会导向不同的结果,这时就会出现策略的选择。
程序中也是一样,而且更加复杂,生活中的抉择一般只有几个,但程序中可能有十多个甚至数十个,也就是我们常用的 if-else
或者 switch
。当只有少量选择时,用这些没有问题,但一旦量比较大,代码的可读性和维护难度会迅速上升,这时候就建议使用策略模式了。
代码实现
这里以相加相减策略来介绍策略模式:
1、定义策略
/**
* 策略
*/
public interface Strategy {
/**
* 运行策略
* @param num1 数字1
* @param num2 数字2
* @return 结果
*/
int doStrategy(int num1, int num2);
}
2、定义相加策略
/**
* 相加策略
*/
public class Add implements Strategy {
@Override
public int doStrategy(int num1, int num2) {
return num1 + num2;
}
}
3、定义相减策略
/**
* 相减策略
*/
public class Subtract implements Strategy {
@Override
public int doStrategy(int num1, int num2) {
return num1 - num2;
}
}
4、定义上下文
/**
* 上下文
*/
public class Context {
private Strategy strategy;
/**
* 指定策略
* @param strategy 策略
*/
public void setStrategy(Strategy strategy) {
this.strategy = strategy;
}
/**
* 执行策略
* @param num1 数字1
* @param num2 数字2
* @return 结果
*/
public int executeStrategy(int num1, int num2) {
return this.strategy.doStrategy(num1, num2);
}
}
5、调用
// 定义上下文
Context context = new Context();
// 设置相加策略
context.setStrategy(new Add());
System.out.println(context.executeStrategy(2, 1));
// 设置相减策略
context.setStrategy(new Subtract());
System.out.println(context.executeStrategy(2, 1));
输出结果为:
3
1
可以发现,按照对应的策略执行了运算,这就是策略模式的基本实现。
与状态模式区别
可以看出,策略模式的实现方式与前面讲的状态模式非常相似,但它们是有本质区别的。
主要体现在转换是主动还是被动的。状态模式是由状态自动触发的,是被动的;策略模式是指定策略再执行的,是主动的。
优缺点
优点
1、算法可以自由切换。
2、避免使用多重条件判断。
3、扩展性良好。
缺点
1、策略类会增多。
2、所有策略类都需要对外暴露。
使用场景
1、如果在一个系统里面有许多类,它们之间的区别仅在于它们的行为,那么使用策略模式可以动态地让一个对象在许多行为中选择一种行为。
2、一个系统需要动态地在几种算法中选择一种。
3、如果一个对象有很多的行为,如果不用恰当的模式,这些行为就只好使用多重的条件选择语句来实现。
注意事项
如果一个系统的策略多于 4 个,就需要考虑使用混合模式,解决策略类膨胀的问题。
参考
https://www.bilibili.com/video/BV1u3411P7Na?p=30&vd_source=299f4bc123b19e7d6f66fefd8f124a03
天河有尽身作涯,星海无边前是岸。