标签:set 它的 定义 head 声明 log 思考 策略 自己
说起对策略模式的学习,那可真是莫名奇妙,在看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。子类继承了普遍的方法,有特别需求的时候,这样好像可以,不过上述问题,如果一种算法要改,则非常麻烦了。
策略模式的决定权在用户,系统本身提供不同算法的实现,对各种算法做封装。因此,策略模式多用在算法决策系统中,外部用户只需要决定用哪个算法即可。
标签:set 它的 定义 head 声明 log 思考 策略 自己
原文地址:http://www.cnblogs.com/dinolin-630/p/7452712.html