专业编程基础技术教程

网站首页 > 基础教程 正文

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

ccvgpt 2024-08-04 12:15:19 基础教程 12 ℃


1.1装饰器模式定义

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

装饰器模式(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;
}

最近发表
标签列表