接口隔离

踏踏实实做事

导航

第一章 - 策略模式

一、初始问题

//如下示例是最初的设计,鸭子都会呱呱叫和游泳,每个鸭子的外观都不同,所以外观设计为纯虚函数,子类自己实现

如下实现了一种红头鸭和一种绿头鸭,在目前的需求下可以很好的运行,代码如下:

#include <iostream>
#include <string>
using namespace std;

class Duck    //鸭子基类
{
public:
    void quack()    //鸭子呱呱叫
    {
        printf("我会呱呱叫\n");
    }            
    void swim()        //鸭子会游泳
    {
        printf("我会游泳\n");
    }        
    virtual void display() = 0;    //抽象的鸭子外观
};

class MullardDuck: public Duck
{
public:
    void display()
    {
        printf("我是绿头鸭\n");
    }
};

class RedHeadDuck: public Duck
{
public:
    void display()
    {
        printf("我是红头鸭\n");
    }
};

void main()
{
    Duck *pDuck1 = new RedHeadDuck();
    Duck *pDuck2 = new MullardDuck();

    pDuck1->display();
    pDuck1->quack();
    pDuck1->swim();
    
    pDuck2->display();
    pDuck2->quack();
    pDuck2->swim();
    
    delete pDuck1;
    delete pDuck2;
}

运行结果:

二、问题升级:

此时,我需要增加需求:

1、我需要鸭子能飞

2、我需要增加一种橡皮鸭(不会飞),一种模型鸭

//需要把特殊属性抽取出来,形成组合,使程序弹性增大,代码如下:

#include <iostream>
#include <string>
#include <vector>
using namespace std;

class  FlyBehavior    //飞行接口
{
public:
    virtual void fly() = 0;
};

class QuackBehavior    //叫声接口
{
public:
    virtual void quack() = 0;
};


class FlyWithWings: public FlyBehavior
{
public:
    virtual void fly()
    {
        printf("我会飞\n");
    }
};

class FlyNoWay: public FlyBehavior
{
public:
    virtual void fly()
    {
        printf("我不会飞\n");
    }
};

class Quack: public QuackBehavior
{
public:
    virtual void quack()
    {
        printf("我会呱呱叫\n");
    }
};

class Squeak: public QuackBehavior
{
public:
    virtual void quack()
    {
        printf("我会吱吱叫\n");
    }
};

class MuteQuack: public QuackBehavior
{
public:
    virtual void quack()
    {
        printf("我不会叫\n");
    }
};

class Duck    //鸭子基类
{
public:
    FlyBehavior      * pFly;    //飞行指针
    QuackBehavior * pQuack;    //鸣叫指针

    void performFly()
    {
        pFly->fly();
    }

    void performQuack()
    {
        pQuack->quack();
    }        
    void swim()        //鸭子会游泳
    {
        printf("我会游泳\n");
    }        
    virtual void display() = 0;    //抽象的鸭子外观
};

class MullardDuck: public Duck
{
public:
    MullardDuck()
    {
        pFly   = new FlyNoWay();
        pQuack = new Quack();
    }
    void display()
    {
        printf("我是绿头鸭\n");
    }
};

class RedHeadDuck: public Duck
{
public:
    RedHeadDuck()
    {
        pFly   = new FlyWithWings();
        pQuack = new Squeak();
    }
    void display()
    {
        printf("我是红头鸭\n");
    }
};

class  RubberDuck: public Duck
{
public:
    void display()
    {
        printf("我是橡皮鸭\n");
    }
};

class  DecoyDuck: public Duck
{
public:
    DecoyDuck()
    {
        pFly   = new FlyNoWay();
        pQuack = new MuteQuack();
    }
    void display()
    {
        printf("我是模型鸭\n");
    }
};
typedef vector<Duck *>VEC_DUCK;
void main()
{
    VEC_DUCK mDuck;
    Duck *pDuck1 = new MullardDuck();
    Duck *pDuck2 = new RedHeadDuck();
    Duck *pDuck3 = new DecoyDuck();

    mDuck.push_back(pDuck1);
    mDuck.push_back(pDuck2);
    mDuck.push_back(pDuck3);

    VEC_DUCK::iterator iter = mDuck.begin();
    for(;iter!= mDuck.end(); iter++)
    {
        Duck * pDuck = *iter;
        pDuck->display();
        pDuck->performFly();
        pDuck->performQuack();
        printf("\n");
        //(*iter).display();
        //*iter->display();
        //iter->performFly();
        //iter->performQuack();
    }
}

posted on 2016-11-17 13:24  接口隔离  阅读(92)  评论(0编辑  收藏  举报