前言
策略模式是一种行为模式,它用以运行时动态的改变类的行为,通过将一系列类似的算法封装成不同的类来达到目的,可以有效减少代码中if else的冗余。它实现的关键是面向接口接口编程以及有一个算法切换者。它的优点是扩展性良好,可以自由切换策略。
栗子
周末天气不错,小明准备去爬武功山,于是他请教它的出行助手应该选择怎样的工具去目的地才能让他最大化周末的快乐。于是它的出行助手开始了一段计算,操作。。。最终。。。
抽象
针对上面的案例,重点在于出行助手如何帮小明选择出行工具,这恰好可以对应我们一开始说的需要封装的算法,并且能够随意切换,于是我们可以得出下面的uml类图:
小明通过使用出行助手来选择不同的交通工具。而出行助手内部则通过代理TravelStrategy接口来切换不同的出行算法。
实现
首先定义出行接口TravelStrategy:
@FunctionalInterface
public interface TravelStrategy {
void travel();
}
接着实现不同的出行算法,此处有BikeTravelStrategy, FootTravelStrategy, CarTravelStrategy。
接着就需要实现出行助手类:TravelService,它内部通过代理TravelStategy来切换不同的策略:
最后,编写一个测试类:
注意上面的关键代码为TravelService根据不同的天气选择了不同的出行策略。
根据结果我们可以知道我们切换了三次不同的策略,并且使用lambda表达式添加了一个匿名策略。
总结
使用策略模式的关键在于面向接口编程,并且有一个全局切换策略的辅助类,它的优点在于扩展性良好,算法可以自由切换动态改变类的行为。
而它的缺点也很明显:策略类过多会导致“类爆炸“,并且所有的策略类都需要向外暴露。 所以使用时如果策略过多可以考虑使用混合模式,配合其它模式一起使用。