结构型模式----装饰模式
装饰模式:在不改变现有对象结构的情况下,动态的给对象增加一些额外功能
实现和结构
模式结构
- 抽象构件:给出一个抽象接口,以规范准备接受附加责任的对象
- 具体构件:实现抽象构件,通过装饰角色为其添加新的功能
- 抽象装饰:继承抽象构件,并包含具体构件的实例,可以通过其扩展具体构件的功能
- 具体装饰:实现抽象装饰的相关方法,并给具体构件对象添加附加的责任
装饰模式的UML类图
模式使用场景
- 需要拓展一个类的功能,或者给一个类添加附加功能
- 需要动态的给一个对象添加功能,这些功能可以动态的撤销
- 需要通过对现有的一组基本功能进行动态组合而产生多种复合功能时(继承实现较为困难)
模式特点
优点
- 装饰模式和继承都能拓展对象的功能,装饰模式更加灵活
- 无需创建新的子类即可拓展对象的行为
缺点
- 装饰模式会导致设计中出现许多小类,会使程序变得更加复杂
装饰模式实例
#include <iostream>
using namespace std;
//抽象构件:奥特曼
class AbstractAltman
{
public:
virtual void showSkill() {}
public:
int skillNum; //技能数量
};
//具体构件:迪迦奥特曼
class DijiaAltman : public AbstractAltman
{
public:
virtual void showSkill()
{
this->skillNum = 2;
cout << "我是迪迦奥特曼,我会变身和打怪兽!!!" << endl;
}
};
//抽象装饰:变身
class Change : public AbstractAltman
{
public:
AbstractAltman* Altman;
Change(AbstractAltman* DijiaAltman) {
this->Altman = DijiaAltman;
}
virtual void showSkill() {}
};
//具体装饰:红色模式
class redChange : public Change
{
public:
redChange(AbstractAltman* Altman) : Change(Altman) {}
//增加额外功能
void changeRed()
{
//掌握变身红色,技能数量+1
this->skillNum = this->Altman->skillNum+1;
cout << "奥特曼变成了红色模式!!!" << endl;
}
void showSkill()
{
changeRed();
cout << this->skillNum << endl;
}
};
//具体装饰:紫色模式
class purpleChange : public Change
{
public:
purpleChange(AbstractAltman* Altman) : Change(Altman) {}
//增加额外功能
void changePurple()
{
//掌握变身紫色,技能数量+1
this->skillNum = this->Altman->skillNum+1;
cout << "奥特曼变成了紫色模式!!!" << endl;
}
void showSkill()
{
changePurple();
cout << this->skillNum << endl;
}
};
int main()
{
AbstractAltman* Dijia = new DijiaAltman;
Dijia->showSkill();
cout << "===============" << endl;
Dijia = new redChange(Dijia);
Dijia->showSkill();
cout << "===============" << endl;
Dijia = new purpleChange(Dijia);
Dijia->showSkill();
cout << "===============" << endl;
system("pause");
return 0;
}