wanlifeipeng

  博客园 :: 首页 :: 博问 :: 闪存 :: :: 联系 :: 订阅 订阅 :: 管理 ::

动态地给一个对象添加一些额外的职责
应用长景:

1.生活中,当我们去购买手机的时候,经常会遇到套餐推荐。比如:只买一部裸机是多少钱,

而外加一个保护膜,构成的套餐价是多少钱。亦或是外加一个保护膜,构成的套餐价多少钱。亦或是保护膜和耳机都要

构成的套餐价是多少钱。

代码:

#include <iostream>
using namespace std;

const int IPHONE_PRICE = 5600;
const int SCREEN_PROTECTOR_PRICE = 100;
const int HEADSET_PRICE = 300;


class Phone
{
public:
    virtual int cost() = 0;
protected:
    int _price;
};

class IPhone : public Phone
{
public:
    IPhone()
    {
        _price = IPHONE_PRICE;
    }

    virtual int cost()
    {
        return _price;
    }
};

class PhoneDecorator : public Phone
{
public:
    PhoneDecorator(Phone *phone) :_phone(phone){}
protected:
    Phone *_phone;
};

class ScreenProtectedPhone : public PhoneDecorator
{
public:
    ScreenProtectedPhone(Phone *phone) : PhoneDecorator(phone)
    {
        _price = SCREEN_PROTECTOR_PRICE;
    }
    virtual int cost()
    {
        cout << "屏保的价格为: " << _price << endl;
        return _price +_phone->cost();
    }

};

class HeadSetPhone : public PhoneDecorator
{
public:
    HeadSetPhone(Phone *phone) :PhoneDecorator(phone)
    {
        _price = HEADSET_PRICE;
    }
    virtual int cost()
    {
        cout << "耳机的价格为: " << _price << endl;
        return _price + _phone->cost();
    }
};

void test()
{
    Phone *p = new IPhone; // iphone
    cout << "手机总价格为: " << p->cost() << endl;
    PhoneDecorator *p1 = new HeadSetPhone(p); // 给裸机加耳机
    cout << "手机总价格为: " << p1->cost() << endl;
    PhoneDecorator *p2 = new ScreenProtectedPhone(p); //给裸机加屏保
    cout << "手机总价格为: " << p2->cost() << endl;
    PhoneDecorator *p3 = new ScreenProtectedPhone(p1); //在加耳机的基础上家屏保
    cout << "手机总价格为: " << p3->cost() << endl;

    delete p3;
    delete p2;
    delete p1;
    delete p;
}

int main()
{
    test();
    cin.get();
    return 0;
}

效果:

 

 2.随着科技的发展,将来的汽车不仅能跑,还可以在水里游,在天上飞

#include <iostream>
using namespace std;

class Car
{
public:
    virtual void show() = 0;
};

class RunnableCar : public Car
{
public:
    virtual void show()
    {
        cout << "汽车能跑" << endl;
    }
};

class CarDecorator : public Car
{
public:
    CarDecorator(Car *car) :_car(car){  }
    virtual void show()
    {
        _car->show();
    }

private:
    Car *_car;
};

class SwimCarDecorator : public CarDecorator
{
public:
    SwimCarDecorator(Car *car) :CarDecorator(car){}
    virtual void show()
    {
        CarDecorator::show();
        swim();
    }

    void swim()
    {
        cout << "汽车能在水里游" << endl;
    }

};

class FlyCarDecorator : public CarDecorator
{
public:
    FlyCarDecorator(Car *car) :CarDecorator(car){}
    virtual void show()
    {
        CarDecorator::show();
        fly();
    }
    void fly()
    {
        cout << "汽车能在天上飞" << endl;
    }
};

void test()
{
    Car *c = new RunnableCar();
    c->show();
    Car *c1 = new SwimCarDecorator(c);
    c1->show();
    Car *c2 = new FlyCarDecorator(c);
    c2->show();
    Car *c3 = new FlyCarDecorator(c1);
    c3->show();
    delete c3;
    delete c2;
    delete c1;
    delete c;
}

int main()
{
    test();
    cin.get();
    return 0;
}

 

posted on 2017-05-02 13:47  wanlifeipeng  阅读(137)  评论(0编辑  收藏  举报