码迷,mamicode.com
首页 > 其他好文 > 详细

Head First 设计模式之一 策略模式

时间:2014-05-20 07:44:04      阅读:233      评论:0      收藏:0      [点我收藏+]

标签:style   blog   class   c   ext   http   

策略模式

定义

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

实例

上面的定义看起来说的不太清楚,记定义无意义,理解策略模式还是要看书中的鸭子例子。假设设计一个模拟鸭子的游戏,鸭子的种类有很多,有红头鸭、绿头鸭等等,鸭子可以划水,可以呱嘎叫。在这个模拟游戏的实现上,自然会想到用继承的方法,定义一个鸭子基类,具体的鸭子类型继承自鸭子基类。如下图所示

bubuko.com,布布扣

所有鸭子都会飞、呱呱叫和游泳,这些功能由基类来实现,display函数用来输出鸭子实例的类型,由每个子类单独实现。

但现在问题来了,因为飞、呱呱叫、游泳都由基类实现,默认所有衍生类都有和基类相同的能力。事实上不是所有的鸭子都会飞,也不是所有的鸭子都呱呱叫,例如橡皮鸭。

要解决这个问题,简单的方法有两个,第一个是方法的覆盖或隐藏基类函数,例如橡皮鸭不能飞,那么在橡皮鸭的定义里生命fly()函数,覆盖或隐藏基类的fly()函数。这种方法的缺点是,每有一个不同于基类方法的子类,都需要单独声明并定义该方法。这样做对于对于继承关系复杂的类结构,添加或修改类都需要很大的工作量。

第二个方法是,将fly()等函数封装到接口中去,子类继承自这些接口,接口中的函数在子类中分别实现。这样做工作量也很大,无法实现方法的复用。

运用策略模式解决问题

策略模式就是把一组行为,也就是一族算法封装成类.在定义新的鸭子子类时,不必为每一个子类分别定义其行为,而只需要在鸭子类中添加封装好的算法。在这个例子中,把飞和呱呱叫都封装成类,这些类独立鸭子类,这种低耦合的方式更利于代码的维护。策略模式的另一个优点是可以更改鸭子的行为。详细内容参见下文代码。本次实例的UML类图如下所示:

 

bubuko.com,布布扣bubuko.com,布布扣

bubuko.com,布布扣bubuko.com,布布扣bubuko.com,布布扣

 

 

C++代码

#include<iostream>

usingnamespace std;

 

 

class IFlyBehavior

{

public:

    virtualvoid Fly() = 0;

};

class IQuakBehavior

{

public:

    virtualvoid Quack() = 0;        

};

class FlyWithWings : public IFlyBehavior

{

public:

    void Fly()

    {

        cout << "I can fly" << endl;

    }

};

 

class FlyNoWay : public IFlyBehavior

{

public:

    void Fly()

    {

        cout << "sorry, I cannot fly" << endl;

    }

};

class SQuack : public IQuakBehavior

{

public:

    void Quack()

    {

        cout << "I can Quack" << endl;

    }

};

class MuteQuack : public IQuakBehavior

{

public:

    void Quack()

    {

        cout << "sorry, I cannot quack" << endl;

    }

};

class Duck

{

public:

    IFlyBehavior *flyBehavior;

    IQuakBehavior *quackBehavior;

    void Swim()

    {

        cout << "I can swim" << endl;

    }

    virtualvoid Display()

    {

        cout << "I am a duck, " ;

    }

     void PerformaceFly()

    {

        Display();

        flyBehavior->Fly();

    }

     void PerformanceQuack()

    {

        Display();

        quackBehavior->Quack();

    }

     void SetFlyBehavior(IFlyBehavior *iFly)

     {

         flyBehavior = iFly;

     }

     void SetQuackBehavior(IQuakBehavior *IQuack)

     {

         quackBehavior = IQuack;

     }

};

class RedHeadDuck : public Duck

{

public:

    RedHeadDuck()

    {

        flyBehavior = new FlyWithWings();

        quackBehavior = new SQuack();

    }

    void Display()

    {

        cout << "I am a red head duck, " ;

    }

    ~RedHeadDuck()

    {

        delete flyBehavior;

        delete quackBehavior;

    }

};

class RubberDuck : public Duck

{

public:

    RubberDuck()

    {

        flyBehavior = new FlyNoWay();

        quackBehavior = new MuteQuack();

    }

    void Display()

    {

        cout << "I am a rubber duck, " ;

    }

    ~RubberDuck()

    {

        delete flyBehavior;

        delete quackBehavior;

    }

};

void main()

{

    RedHeadDuck redDuck;

    RubberDuck rubberDuck;

 

    redDuck.PerformaceFly();

    redDuck.PerformanceQuack();

    cout << endl;

 

    rubberDuck.PerformaceFly();

    rubberDuck.PerformanceQuack();

    cout << endl;

 

    rubberDuck.SetFlyBehavior(new FlyWithWings());

    rubberDuck.SetQuackBehavior(new SQuack());

    rubberDuck.PerformaceFly();

    rubberDuck.PerformanceQuack();

    system("pause");

}

运行结果

bubuko.com,布布扣

Head First 设计模式之一 策略模式,布布扣,bubuko.com

Head First 设计模式之一 策略模式

标签:style   blog   class   c   ext   http   

原文地址:http://www.cnblogs.com/wangke1020/p/3736470.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!