1.什么是装饰模式
装饰模式,在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能。它是通过创建一个包装对象,也就是装饰来包裹真实的对象。动态地给一个对象添加一些额外的职责。这样是能够把类中的装饰功能从类中搬移出去,这样可以简化原有的类。有效地把类的核心功能和装饰功能区分开了。
2.装饰模式的实现
在本例子中,举例最常见的人穿衣服的例子,首先我们定义这样一个Person的基类,如下:
#include <cstdio> #include <string> #include <iostream> using namespace std; class Person { public: Person(){} Person(string n) { name = n; } virtual void show() = 0; private: string name; };
在基类下,有着不同种类的人,我们就定义男人这样一个子类如下:
class Men:public Person { public: Men(string n):name(n){}; virtual void show() { cout<<name<<" de zhuang shi"<<endl; } private: string name; };
下面我们就要用到一个装饰类,如装饰一个人,我们对装饰类定义如下:
class Finery:public Person { public: Finery(Person *c) { component = c; } virtual void show() { component->show(); } protected: Person *component; };
在装饰的类下,我们可以定义一个一个的装饰细节,比如我们定义一个Tshirt的类和一个Cap的类:
class Tshirts:public Finery { public: Tshirts(Person *p):Finery(p) {} void show() { component->show(); add(); } void add() { cout<<"add Tshirts"<<endl; } }; class Cap:public Finery { public: Cap(Person *p):Finery(p) {} void show() { component->show(); add(); } void add() { cout<<"add Cap"<<endl; } };
在客户端中,我们通过调用
Person *man = new Men("wq"); Person *dpa = new Tshirts(man); Person *dpb = new Cap(dpa); dpb->show();
就可以装饰我们实例化的那个人的对象,从这里我们可以看出,首先我们实例化一个叫做wq的对象,然后我们在这个对象之上,实例化一个Tshirt,但是仍然使用基类的指针,同理Cap的实例化过程也是这样的,当我们调用dpb的时候,实际上我们调用的装饰好的对象。
时间: 2024-12-26 18:45:16