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