装饰模式: 动态地给一个对象添加一些额外的指责,就增加功能来书,装饰模式比生成子类更为灵活。
装饰模式是唯一有的功能动态地添加更多功能地一种方式。
在最初设计的时候,当系统需要新功能的时候,是向旧的类中添加新的代码。这些新的代码通常修饰了原有类的核心指责或主要行为。
在主类中添加新的字段,新的方法和新的逻辑,从而增加了主类的复杂度,而这些新加入的东西仅仅是为了满足一些只在某种特定的情况下才会执行的特殊需求。
装饰模式却提供了一个非常好的解决方案,他把每个要装饰的功能放在单独的类中,并让这个类包装它所要装饰的对象,因此,当需要特殊的行为的时候,客户代码就可以在运行的时候根据需要有选择地、按顺序地私用装饰功能包装对象了。
优点:
有效地把类的核心指责和装饰地功能分开,而且可以去除相关类地重复地修饰逻辑
#include <iostream>
#include <string>
using namespace std;
class Person
{
public:
Person(){}
Person(string n):name(n){}
virtual void Show()
{
cout << name << "穿着" << dress << endl;
}
string &GetDress()
{
return dress;
}
private:
string name;
string dress;
};
class Finery:public Person
{
protected:
//装饰器中保存真实对象引用或指针,以便可以动态地位对象增加一些新的功能
Person *person;
public:
virtual void Decorate(Person &p) = 0;
virtual void Show()
{
person->Show();
}
};
class TS:public Finery
{
public:
virtual void Decorate(Person &p)
{
p.GetDress() = p.GetDress() + " 大T恤 ";
this->person = &p;
}
virtual void Show()
{
person->Show();
}
};
class KZ:public Finery
{
public:
virtual void Decorate(Person &p)
{
p.GetDress() = p.GetDress() + " 裤子 ";
this->person = &p;
}
virtual void Show()
{
person->Show();
}
};
int main()
{
Person *per = new Person("妹子");
TS *ts = new TS();
KZ *kz = new KZ();
ts->Decorate(*per);
ts->Show();
kz->Decorate(*per);
kz->Show();
return 0;
}