一、装饰模式
装饰模式可以实现功能动态扩展,把要附加的功能分别放在单独的类中,让这个类包含它要装饰的对象,当需要执行时,客户端就可以有选择地使用装饰功能包装对象
二、例子
比如一个人,当进入装饰器以后,就变成一个新的对象,这个对象具有以前对象的功能,同时也具有新对象的功能
#include <iostream>
#include <list>
using namespace std;
class AbstractHero {
public:
virtual void ShowStatus() = 0;
// 基本属性
int _Hp;
int _Mp;
};
class HeroA : public AbstractHero {
public:
HeroA() {
_Hp = 0;
_Mp = 0;
}
virtual void ShowStatus() {
cout << "血量:" << _Hp << endl;
cout << "蓝量:" << _Mp << endl;
}
};
class AbstractEquip : public AbstractHero {
public:
AbstractEquip(AbstractHero* hero) {
p_hero = hero;
}
virtual void ShowStatus() {}
AbstractHero* p_hero;
};
class Equip1 : public AbstractEquip {
public:
Equip1(AbstractHero* hero) : AbstractEquip(hero) { }
// 增加额外功能
void addEquip1() {
_Hp = p_hero->_Hp + 100; // 穿装备后
_Mp = p_hero->_Mp;
delete p_hero;
}
virtual void ShowStatus() {
cout << "euip1...\n";
addEquip1();
cout << "血量:" << _Hp << endl;
cout << "蓝量:" << _Mp << endl;
}
};
class Equip2 : public AbstractEquip {
public:
Equip2(AbstractHero* hero) : AbstractEquip(hero) { }
// 增加额外功能
void addEquip2() {
_Hp = p_hero->_Hp + 20; // 穿装备后
_Mp = p_hero->_Mp + 30;
delete p_hero;
}
virtual void ShowStatus() {
cout << "euip2...\n";
addEquip2();
cout << "血量:" << _Hp << endl;
cout << "蓝量:" << _Mp << endl;
}
};
void test() {
AbstractHero* hero = new HeroA;
hero->ShowStatus();
cout << "===== Equip =====\n";
hero = new Equip1(hero);
hero->ShowStatus();
hero = new Equip2(hero);
hero->ShowStatus();
}
int main() {
test();
return 0;
}