动态地给对象添加一些额外的职责,按添加的顺序添加职责,建造过程不稳定,即是当你向旧的类中添加新代码时,一般是为了添加核心职责或主要行为。而当需要加入的仅仅是一些特定情况下才会执行的特定的功能时(简单点就是不是核心应用的功能),就会增加类的复杂度。装饰模式就是把要添加的附加功能分别放在单独的类中,并让这个类包含它要装饰的对象,当需要执行时,客户端就可以有选择地、按顺序地使用装饰功能包装对象。代码如下:
#include <iostream>
#include <string>
using namespace std;
//人类基类
class person
{
public:
person() {}
virtual ~person() {}
virtual void show() {}
};
//具体人类的类,黄种人
class huang : public person
{
private:
string m_name;
public:
huang (string name) : m_name( name ) {}
virtual ~huang() {}
virtual void show()
{
cout << "黄种人" << m_name << "的搭配:" << endl;
}
};
//装饰基类,继承person类的
class decorator : public person
{
private:
person *person1;
public:
decorator( person *name ) : person1( name ) {}
virtual void show() { person1->show(); }
};
//具体的装饰类,Tshirts
class Tshirts : public decorator
{
public:
Tshirts( person *person ) : decorator( person ) {}
void show() { decorator::show(); add_Tshirts(); }
private:
void add_Tshirts() { cout << "Tshirts" << endl;}
};
//具体的装饰类,长裤
class pants : public decorator
{
public:
pants( person *person ) : decorator( person ) {}
void show() { decorator::show(); add_pants(); }
private:
void add_pants() { cout << "长裤" << endl; }
};
int main()
{
person *p1 = new huang( "yang" );
person *p2 = new Tshirts(p1);
person *p3 = new pants(p2);
p3->show();
return 0;
}
要注意的是建造过程的顺序是由客户决定的,具体点讲就是客户决定了要先穿裤子还是先穿长裤,所以在添加功能的时候客户要自己注意添加的顺序,如果先穿外套再穿Tshirts就不太好了