策略模式(Strategy Pattern)
一、UML图以及各角色介绍
1》环境(Context)角色:持有一个Strategy类的引用(上下文对象),负责和具体的策略类交互。
2》抽象策略(Strategy)角色:这是一个抽象角色,通常由一个接口或抽象类实现。此角色给出所有的具体策略类所需的接口。
3》具体策略(ConcreteStrategy)角色:包装了相关的算法或行为。
二、模式特色
1》策略模式的用意是针对一组算法,将每一个算法封装到具有共同接口的独立的类中,从而使得它们可以相互替换。策略模式使得算法可以在不影响到客户端的情况下发生变化。
2》使用策略模式可以把行为和环境分割开来。环境类负责维持和查询行为类,各种算法则在具体策略类(ConcreteStrategy)中提供。
3》由于算法和环境独立开来,算法的增减、修改都不会影响环境和客户端。当出现新的促销折扣或现有的折扣政策出现变化时,只需要实现新的策略类,并在客户端登记即可。策略模式相当于"可插入式(Pluggable)的算法"
三、模式优缺点
1》优点:
<1> 策略模式可以避免让客户端涉及到不必要接触到的复杂的和只与算法有关的数据。
<2>避免使用难以维护的多重条件选择语句【相对于环境类而言,环境类不用做判断】
<3>更好的扩展
2》缺点:
<1> 客户端必须知道所有的策略类【相当于将 if-else 扔给用户】,并自行决定使用哪一个策略类。这就意味着客户端必须理解这些算法的区别,以便适时选择恰当的算法类。
<2> 增加了对象的数目
<3> 只适合扁平的算法结构
四、模式的本质
分离算法,选择实现。
五、应用场景
1》出现同一个算法,有很多不同的实现的情况,可以使用策略模式来把这些“不同的实现”实现成为一个算法的类层次
2》出现抽象一个定义了很多行为的类,并且是通过多个if-else语句来选择这些行为的情况,可以使用策略模式来代替这些条件语句
五、例题展示
1》https://blog.csdn.net/sodacoco/article/details/90928436
2》https://blog.csdn.net/sodacoco/article/details/90938364