======================================
一 装饰器模式
1 装饰器模式概念
如果可以通过一个已经存在的类,额外添加一个功能,生成一个新的类
这种类就是一个装饰器,
2 装饰器模式代码
#include <iostream> using namespace std; //创建一个抽象的手机类 class Phone { public: virtual void show() = 0; }; //创建一个具体的手机继承并实现抽象的手机类 class Mi :public Phone { public: void show() { cout << "秀出了小米手机" << endl; } }; //如果要给小米手机添加一个膜,那么我们可以修改Mi类,定义贴膜函数,但是不符合开闭原则
//所以可以用装饰器模式 //创建一个装饰器类同样继承Phone,让装饰器类和具体手机类有同一个父类 //但是这个装饰如同一个代理,并不是实现功能,因为可能不止要添加一个功能 //所以应该继续抽象出show方法 class Decorate :public Phone { public: Decorate(Phone *myphone) :myphone(myphone){} virtual void show() = 0; protected: Phone *myphone; }; //创建一个贴膜功能类,去继承并实现装饰器类,这个功能类的父类便是装饰器类 class 贴膜 :public Decorate { public: //去初始化父类的保护成员,主要由父类去调用show 贴膜(Phone *phone) :Decorate(phone){} //去实现父类的方法,并且通过父类的保护成员调用实现方法 //然后调用自己的方法 virtual void show() { this->myphone->show(); this->贴(); //自己的方法 } void 贴() { cout << "已贴膜" << endl; } }; class 手机套 :public Decorate { public: 手机套(Phone *myphone) :Decorate(myphone){} void show() { this->myphone->show(); this->phone_shell(); } void phone_shell() { cout << "手机套" << endl; } }; int main() { Phone *p1 = new Mi; Phone *p2 = new 贴膜(p1); p2->show(); cout << "==================" << endl; Phone *p3 = new 手机套(p2); p3->show(); }
3 代理模式和装饰器模式的区别
(1) 代理模式是指自己能做到, 但是让别人去做,别人能做的更多
相当于加了一层壳
(2) 装饰器模式指的是一个原有的功能上添加功能,相当于加了很多
装饰的功能
(3)从代码层来看,代理模式是在代理类里实现功能,而装饰器模式
则比代理模式多抽象了一层.