定义
策略模式(Strategy Pattern):定义一系列算法,将每一个算法封装起来,并让它们可以相互替换。
适用场景
有时候在实现某一个功能的时候可能会有多个方案:我们需要让系统可以动态灵活地更换方案;而且也能够让开发者方便地增加新的方案或删除旧的方案。
如果我们将所有的方案硬编码在同一个类中,那么在今后修改,添加,删除某个方案的时候就会改动原有类,这是违反开闭原则的。
其实我们可以定义一些独立的类来封装不同的解决方案,每一个类封装一个具体的方案,这些不同的方案就是我们所说的策略。而且我们可以用一个抽象的策略类来保证这些策略的一致性,这就是策略模式的设计方案。
现在我们清楚了策略模式的适用场景,下面看一下策略模式的成员和类图。
成员
策略模式除了客户端之外共有三个成员:
环境类(Context):环境类内部持有一个具体策略类的实例,这个实例就是当前的策略,可以供客户端使用
抽象策略类(Strategy):抽象策略类声明具体策略类需要实现的接口,这个接口同时也是提供给客户端调用的接口
具体策略类(Concrete Strategy):具体策略类实现抽象策略类声明的接口,每个具体策略类都有自己独有的实现方式,即代表不同策略
下面我们通过类图来看一下各个成员之间的关系。
image
image
优点
策略模式遵循开闭原则,用户可以在不修改原有系统的前提下选择和更换算法
避免使用多重条件判断
可以灵活地增加新的算法或行为
提高算法和策略的安全性:可以封装策略的具体实现,调用者只需要知道不同策略之间的区别就可以
缺点
客户端必须知道当前所有的具体策略类,而且需要自行决定使用哪一个策略类
如果可选的方案过多,会导致策略类数量激增。
网友评论