设计模式--策略模式

多态:同一类型的指针或引用在指向不同子类对象时可以表现出不同的行为。我们知道多态最常见的实现方式就是基类定义虚函数,派生类通过继承基类的函数后,对基类函数重写来实现。但是在项目中,往往出现表现多态的类本身改动很小,而该类簇的行为改动频繁,(或者可能行为的实现时算法同学负责,而多态类时我们架构同学负责)那么我们把多态类视为使用行为的上下文,把行为从中抽象出来定义成行为类,这就引出了多态实现的另一种方式:通过继承基类的行为对象成员,然后派生类将成员初始化为不同的行为派生类对象,这样在调用行为类对象的方法时就能表现出多态,而且行为类可以频繁改变,而不用改动上下文。

1. 类关系图:

SearchScenario BaseStrategy* _strategy search() VideoSearchScenario BaseStrategy* _strategy=RnnStrategy search() ImageSearchScenario BaseStrategy* _strategy=CnnStrategy search() TextSearchScenario BaseStrategy* _strategy=LtrStrategy search() BaseStrategy do_search() LtrStrategy do_search() RnnStrategy do_search() CnnStrategy do_search()

当然也不仅仅用于实现多态,将行为类从上下文类中抽离成类别,减少对上下文类的侵入性本身就是很好的设计。其类图如下,用户可以方便的通过set_strategy(BaseStrategy* concrete_startegy);为上下文类设置属性的方式,动态设定具体的行为对象。

VideoSearchContext BaseStrategy *_startegy set_strategy(BaseStrategy* strategy) search_video() BaseStrategy do_search() LtrStrategy do_search() RnnStrategy do_search() CnnStrategy do_search()

2. 使用场景

总结一下,策略模式的适用场景可以作为

  • 实现多态的新方式
  • 在上下文类改动小行为改动频繁的情况下(特别是不同部门来负责的情况下),抽离出行为类可以减少对上下文的侵入性。
  • 在类设计的角度,行为类的体量相当或者超过了上下文类的体量,那么行为不应该在类中直接定义,应该作为其成员对象,通过组合的方式实现功能。
上一篇:如何少写if-else


下一篇:Java中的23个设计模式 【结构型模式】 中的 【策略模式】