设计模式14-装饰模式

本文介绍了装饰模式,一种用于动态添加功能的设计模式。通过装饰模式,可以在不修改原有对象的基础上,通过添加新的对象来扩展功能。文章通过实例解释了如何使用装饰模式,例如一个人在进入特定环境后,可以同时拥有原本的特性和新获得的特性。
摘要由CSDN通过智能技术生成


一、装饰模式

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

二、例子

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

#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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值