开始学习设计模式,今天的是装饰模式。
引用《大话设计模式》:
- 装饰模式,动态地给一个对象添加一些额外的职责,就增加功能而言,装饰模式比生成子类更为灵活
- 装饰对象的实现和如何使用这个对象分离开了,每个装饰对象只关心自己的功能,不需要关心如何被添加到对象链当中
- 当系统需要新功能的时候,且新的功能仅仅是为了满足一些只在特定情况下使用的情形,这个时候使用装饰模式是很好的
- 装饰模式可以把要添加的功能放在单独的类中,并让这个类包装他所需要的装饰的对象,当需要执行特殊行为时,客户代码就可以在运行时根据需求有选择的、按顺序的使用装饰功能包装对象了。
- 优点:把类中的装饰功能从类中搬移去除,简化原有的类。有效将类的核心职责和装饰功能区分开来,且可以去除相关类中重复的装饰逻辑。
下面附上代码(代码中Person可以不是纯虚函数,Girl和Boy不是必须的):
#include <iostream>
#include <string>
using namespace std;
//先定义一个基础的person类
class Person
{
public:
Person() {}
virtual ~Person() = 0;
virtual void showMe() = 0;
};
class Girl :public Person
{
public:
Girl() {}
~Girl() {}
virtual void showMe()
{
cout << "I am a girl" << endl;
}
};
class Boy :public Person
{
public:
Boy() {}
~Boy() {}
virtual void showMe()
{
cout << "I am a boy" << endl;
}
};
//person 想戴个帽子
class PersonHaveHat :public Person
{
private:
Person *p;
public:
PersonHaveHat(Person *_p)
{
p = _p;
}
virtual ~PersonHaveHat() {}
virtual void showMe() override
{
p->showMe();
cout << "I have a hat!" << endl;
}
};
//Person 想买个车
class PersonHaveCar : public Person
{
private:
Person *p;
public:
PersonHaveCar(Person *_p)
{
p = _p;
}
virtual ~PersonHaveCar() {}
virtual void showMe() override
{
p->showMe();
cout << "I have a car!" << endl;
}
};
int main()
{
//新建一个Girl
Person *girl = new Girl();
//加个帽子
PersonHaveHat *addhat = new PersonHaveHat(girl);
//加个车
PersonHaveCar *addcar = new PersonHaveCar(addhat);
addcar->showMe();
delete addcar;
delete addhat;
delete girl;
//新建一个Boy
Person *boy = new Boy();
//这次先加车
addcar = new PersonHaveCar(boy);
addhat = new PersonHaveHat(addcar);
addhat->showMe();
delete addcar;
delete addhat;
delete boy;
system("pause");
return 0;
}