【设计模式】09 装饰器模式

1.1装饰器模式定义
装饰器模式(Decorator Pattern),也叫包装模式 Wrapper Pattern

是指在不改变原有对象的基础之上,将功能附加到对象上.提供了比继承更灵活的替代方法 属于结构型模式.

1.2装饰器的UML类图

在这里插入图片描述

从类图分析 主要包含4种角色
抽象组件(Component):可以是一个接口或者抽象类:其充当被装饰类的原始对象,定义了被装饰的对象方法(既 抽出公用的方法)
具体实现类(ConcreteComponent): 继承/实现Component的一个具体对象,也是被装饰对象
抽象装饰器(Decorator)* 通用的装饰ConcreteComponent的装饰器,Decorator其内部必然有个属性指向Component 抽象组件;里面一般包含的是抽象类/接口,主要是为了让其子类按照其构造形式传入一个 Component 抽象组件,这是强制的通用行为(当然,如果系统中装饰逻辑单一,并不需要实现许
多装饰器,那么我们可以直接省略该类,而直接实现一个具体装饰器(ConcreteDecorator)即可);

具体装饰器(ConcreteDecorator):Decorator 的具体实现类,理论上,每个 ConcreteDecorator都扩展了Component对象的一种功能;

原文链接:https://blog.csdn.net/qq_40665874/article/details/106687718

设想这样一个场景:

打游戏时,英雄开始的时候是没有装备也没有套装,随着经验、金钱的增加,会有套装和装备。这时英雄还是英雄,只是和以前的不一样了。

#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 WuJinKinfe:public AbstractEquipment
{
public:
	WuJinKinfe(AbstractHero* Hero) :AbstractEquipment(Hero) {}

	//增加额外的功能
	void addWujin()
	{
		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()
	{
		addWujin();
		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 WuJinKinfe(hero);
	hero->showStatus();
}

int main(int argc, int* argv[])
{
	test01();
	system("pause");
	return 0;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值