设计模式14-装饰模式

文章目录

  • 一、装饰模式
  • 二、例子


一、装饰模式

装饰模式可以实现功能动态扩展,把要附加的功能分别放在单独的类中,让这个类包含它要装饰的对象,当需要执行时,客户端就可以有选择地使用装饰功能包装对象

二、例子

比如一个人,当进入装饰器以后,就变成一个新的对象,这个对象具有以前对象的功能,同时也具有新对象的功能

#include 
#include 

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;
}

你可能感兴趣的:(设计模式)