策略模式(Strategy Pattern)

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

看起来有点抽象吗?下面我们来看看它具体是如何实现的。

1.应用场景

   PM叫你编写一个鸭子的小程序,展示不同的鸭子,黄毛鸭,黑毛鸭,白毛鸭。

2.决解办法

  首先对鸭子进行抽象,鸭子的行为有,飞,叫,游泳,并且长的不一样。

   方法一、使用继承,写一个鸭子的父类,父类实现了fly(),quack(),swing()方法,和一个draw()抽象方法,所有的鸭子都继承此父类,实现draw()方法。

              你会想这简直太简单了,完全难不倒我。可是有一天客户要求在这个程序中加入橡皮鸭,橡皮鸭不会飞,只会叫和游泳。你会想继续使用继承,然后覆盖fly()方法,就搞定了,我简直太聪明了!可是后面客户如果要求加入木鸭子、气球鸭,你怎么办?还是使用继承?继续使用继承代码维护变得越来越困难。

  方法二、使用接口,定义flyImpl,quackImpl,swingImpl,drawImpl接口,然后鸭子根据其行为实现接口,这样你的代码复用性将大大降低,可能出现同样的代码,出现多次,真是糟糕透了。

             当鸭子越来越多的时候,你的代码维护将非常昂贵,到时候你会祈求谁能救你。

  方法三,使用策略模式,把变化的部分封装,分离变化,这样就不会干扰不变部分的代码,下面我们一起来看看如何实现。

               

                上图我们可以分成以下几个步骤:

                1.定义flyBehavior,quackBehavior接口

                2.飞行行为实现flyBehavior接口,叫行为实现quackBehavior接口

                3.定义一个鸭子的父类Duck,该类有flyBehavior和quackBehavior属性,并且有setFlyBehavior和setQuackBehavior方法

                4.所有鸭子继承Duck,并且设定FlyBehavior和QuackBehavior行为

3.总结

   对比以上3种实现方式,明显策略模式更胜一筹,其采用组合的方式,提高代码的复用性,同时降低了维护的成本。从这个模式里我们应该学到的一项设计原则是:多用组合,少用继承

 

                

posted @ 2014-03-07 11:55  艾玛&术  阅读(244)  评论(0编辑  收藏  举报