策略模式

Posted Dino林

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了策略模式相关的知识,希望对你有一定的参考价值。

  说起对策略模式的学习,那可真是莫名奇妙,在看Head First设计模式开篇的过程中,不知不觉就发现自己了解了策略模式的大致模型。不得不感叹啊,Head First系列真是不错!

  现在来分析分析。

  “策略模式定义了算法族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化独立于使用算法的客户。”

  

  首先,我们有一个鸭子类,它声明了QuackBehavior和FlyBehavior接口,并可以通过构造函数、set方法实例化它们。

  而Quack,Squeak,MuteQuack则是QuackBehavior的实现类。

  ADuck继承了Duck,它的performQuack方法里面是这样实现的: quackBehavior.quack(); 

  因为没有初始化quackBehavior,这样当然不行,所以,我们ADuck aDuck = new ADuck()之后呢,需要 aDuck.setQuackBehavior(???); 

  其中???自然就是QuackBehavior的实现类了。 ADuck想怎么叫,就把相对应实现类塞进去就可以了。

  这样,QuackBehavior的几个实现类,其实是可以互相替换的。

  这样的处理方式,就是策略模式。

  那么,这样用的好处在哪里呢?

  如果我们不这样实现,可以怎样实现? 

  把fly,quack做成接口,flyable,quackable,然后各个Duck实现。这样,每一个duck,都需要实现它们,这样当然可以,不过是不是略显麻烦?

  我有一批的duck,其实是同一种叫法的,另一批duck又是另一种叫法,这样重复实现quack()的代码就会特别多吧。

  我们再思考一下,要不,由Duck来实现flyable,quackable。子类继承了普遍的方法,有特别需求的时候,这样好像可以,不过上述问题,如果一种算法要改,则非常麻烦了。

 

  策略模式的决定权在用户,系统本身提供不同算法的实现,对各种算法做封装。因此,策略模式多用在算法决策系统中,外部用户只需要决定用哪个算法即可。

以上是关于策略模式的主要内容,如果未能解决你的问题,请参考以下文章

策略模式(Strategy Pattern)

spring中如何使用策略模式

策略模式

设计模式中的多态——策略模式详解

java设计模式---策略模式(案例解析)

设计模式——策略模式