标签:
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的时候,实际上我们调用的装饰好的对象。
标签:
原文地址:http://www.cnblogs.com/MPoooooo/p/4495898.html