目录
1.本质:分离算法,选择实现
2.定义
策略模式是属于行为型模式,对象有某个行为,但是在不同的场景中,该行为有不同的实现算法。它定义了算法家族,分别封装起来,让他们之间可以互相替换,此模式让算法的变化,不会影响到使用算法的客户。
3.模式的结构与实现
- 抽象策略角色(Strategy):
策略类,通常由一个接口或者抽象类实现。定义所有支持的算法的公共接口(下文的Interface())。
- 具体策略角色(ConcreteStrategy):
封装了具体的算法和行为,继承于Strategy(重写父类的方法Interface())。
- 环境角色 /上下文(Context):
持有一个策略类的引用,最终给客户端调用。
public class Context{ private Strategy strategy; //策略对象 public Context(Strategy strategy){ //初始化时,传入具体的策略对象 this.strategy = strategy; } public void ContextInterface(){ //根据具体的策略对象,动态选择方法 Strategy.Interface(); } }
4.优缺点
优点:
- 简化了单元测试,因为每个算法都有自己的类,可以通过自己的接口单独测试
- 策略模式提供了管理相关的算法族的办法(策略类的等级结构定义了一个算法或行为族。恰当使用继承可以把公共的代码转移到父类里面,从而避免重复的代码)
- 策略模式提供了可以替换继承关系的办法(继承可以处理多种算法或行为。如果不是用策略模式,那么使用算法或行为的环境类就可能会有一些子类,每一个子类提供一个不同的算法或行为。但是,这样一来算法或行为的使用者就和算法或行为本身混在一起。决定使用哪一种算法或采取哪一种行为的逻辑就和算法或行为的逻辑混合在一起,从而不可能再独立演化。继承使得动态改变算法或行为变得不可能)
- 策略模式可以避免使用多重条件转移语句(多重转移语句不易维护,它把采取哪一种算法或采取哪一种行为的逻辑与算法或行为的逻辑混合在一起,统统列在一个多重转移语句里面,比使用继承的办法还要原始和落后)
缺点:
- 客户端必须知道所有的策略类,并自行决定使用哪一个策略类(策略模式只适用于客户端知道所有的算法或行为的情况)
- 策略模式造成很多的策略类(可以使用享元模式来减少对象的数量)
5.使用场景
- 多个类只区别在表现行为不同,在运行时动态选择具体要执行的行为。
- 对客户隐藏具体策略的实现细节,彼此完全独立
- (支付活动,打折活动)