装饰模式

装饰模式

装饰模式又叫包装模式,通过一种对客户端透明的方式来扩展对象功能,是继承关系的一种替代。

装饰模式就是把要附加的功能分别放在单独的类中,并让这个类包含它要装饰的对象,当需要执行时,客户端就可以有选择的、按顺序的使用装饰功能包装对象。

比如:给小人穿衣服。可以穿背心,裤衩,裤兜子等。如果使用继承,小人需要继承背心,继承裤衩,继承裤兜子,这样继承关系复杂,代码维护起来不方便。


#include<iostream>
using namespace std;
//装饰模式
//一般情况下,用继承实现类功能的扩展
//装饰模式 可以动态给类增加功能

//抽象英雄,英雄共有的行为
class AbstractHero{
public:
	virtual void ShowStatus() = 0;
public:
	//属性值
	int mHp;//血量
	int mMp;//魔法
	int mAt;//攻击	
	int mDf;//防御
};
//具体英雄
class HeroA : public AbstractHero{
public:
	HeroA(){
	 mHp = 0 ;
	 mMp = 0 ;
	 mAt = 0 ;	
	 mDf = 0 ;
	}
	virtual void ShowStatus(){
		cout<<"血量:"<< mHp << endl;
		cout<<"魔法:"<< mMp << endl;
		cout<<"攻击:"<< mAt << endl;
		cout<<"防御:"<< mDf << endl;
	}
};
//英雄穿上某个装饰物,那么他还是个英雄,但是和之前那个英雄有区别,因为他穿上了衣服
//所以穿上装备的英雄同时具有了以前英雄和现有装备的能力。
//抽象装备
class AbstractEquipment : public AbstractHero{
public:
	AbstractEquipment(AbstractHero* hero){
		this->pHero=hero;
	}
	virtual void ShowStatus(){}//让子类去实现这个函数
public:
	AbstractHero* pHero;
};
//具体装备,如狂徒铠甲
class KuangTuEquipment : public AbstractEquipment{
public:
	//这里要调用基类函数哦!!!
	KuangTuEquipment(AbstractHero* hero):AbstractEquipment(hero){
	}
	//增加额外功能
	void AddKuangtu(){
		cout<<"英雄穿上狂徒之后..."<<endl;
		this->mHp = this->pHero->mHp;
		this->mMp = this->pHero->mMp;
		this->mAt = this->pHero->mAt;//之前的不变
		this->mDf = this->pHero->mDf + 30;

		delete this->pHero;
	}
	virtual void ShowStatus(){
		AddKuangtu();
		cout<<"血量:"<< mHp << endl;
		cout<<"魔法:"<< mMp << endl;
		cout<<"攻击:"<< mAt << endl;
		cout<<"防御:"<< mDf << endl;
	}
};
class Wujinzhiren : public AbstractEquipment{
public:
	Wujinzhiren(AbstractHero* hero):AbstractEquipment(hero){
	}
	//增加额外功能
	void AddWujinzhiren(){
		cout<<"英雄配备无尽之刃之后..."<<endl;
		this->mHp = this->pHero->mHp;
		this->mMp = this->pHero->mMp;
		this->mAt = this->pHero->mAt + 80;
		this->mDf = this->pHero->mDf;

		delete this->pHero;
	}
	virtual void ShowStatus(){
		AddWujinzhiren();
		cout<<"血量:"<< mHp << endl;
		cout<<"魔法:"<< mMp << endl;
		cout<<"攻击:"<< mAt << endl;
		cout<<"防御:"<< mDf << endl;
	}
};
void test01()
{
	AbstractHero* hero = new HeroA;
	hero->ShowStatus();

	cout<<"--------------"<<endl;
	//给裸奔的英雄穿上衣服
	hero = new KuangTuEquipment(hero);
	hero->ShowStatus();

	cout<<"--------------"<<endl;
	//给英雄装备武器
	hero = new Wujinzhiren(hero);
	hero->ShowStatus();

	delete hero;
	hero = NULL;
}
int main(void)
{
	test01();
	system("pause");
	return 0;
}

因为英雄穿上衣服之后还是英雄,所以穿衣服的英雄就应该有裸奔英雄的行为ShowStatus()。

所以抽象装备继承于抽象英雄。

class AbstractEquipment : public AbstractHero{};







  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值