动态地给一个对象添加一些额外的职责
应用长景:
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; }