C++装饰器模式
2023-09-14 09:12:43 时间
学了C++基本的语法都知道继承可以让子类拥有更多的功能,除了继承还有组合,委托,也能让一个类的功能增加。设计模式,这个设计是设计继承,组合,委托,之间相互叠加的方式,让其符合业务需求。
装饰器模式是多态和托管的运用,它在一个类A中为类B修改或增加一些属性,增加或修改后,因为类A与类B同为一个基类的派生类(也可能派生多次),因此依然可以用基类的对象指针指向类B的实例。因此整体看来,好像为类A的实例装饰了一些属性一样。
这些代码都是在学习这些的过程中码的。。。。。
上代码,亲测有效!
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
using namespace std;
//一般情况下 用继承实现类的功能扩展
//装饰器模式 可以动态的给一个类增加功能
//抽象英雄
class AbstractHero
{
public:
//展示能力
virtual void ShowStatus() = 0;
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(){}
//把英雄放到装饰物基类
//定义对象指针,不算实例化
AbstractHero* pHero;
};
//狂徒(衣服)
//孙子继承抽象英雄类,且孙子数据成员化抽象英雄
/*孙子化继承英雄使本类还是英雄
儿子化继承pHero,使本类可以修改抽象类英雄对象指针的值
之所以要有抽象的装饰类,是因为要有各种子类的装饰器*/
class KuangtuEquipment : public AbstractEquipment
{
public:
//构造函数,调用基类构造函数,给基类数据数据成员:
//抽象类英雄的对象指针赋值
KuangtuEquipment(AbstractHero* hero) : AbstractEquipment(hero){}
//额外增加功能
void AddKuangtu()
{
//四个值孙子化继承抽象类英雄
//PHero,儿子化继承抽象装饰物
//在此类给pHero指针赋值后,去初始化
//本类的四个值
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 << "血量:" << this->mHp << endl;
cout << "魔法:" << this->mMp << endl;
cout << "攻击:" << this->mAt << endl;
cout << "防御:" << this->mDf << endl;
}
};
//无尽之刃
class WujinKnife : public AbstractEquipment
{
public:
WujinKnife(AbstractHero* hero) : AbstractEquipment(hero){}
//额外增加功能
void AddKuangtu()
{
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()
{
AddKuangtu();
cout << "血量:" << this->mHp << endl;
cout << "魔法:" << this->mMp << endl;
cout << "攻击:" << this->mAt << endl;
cout << "防御:" << this->mDf << endl;
}
};
void test01()
{
cout << "------下面是没加装备状态--------" << endl;
AbstractHero* hero = new HeroA;
hero->ShowStatus();
cout << "--------给英雄穿上狂徒后---------" << endl;
//给裸奔的英雄穿上英雄
hero = new KuangtuEquipment(hero);
hero->ShowStatus();
cout << "------给英雄装备无尽之刃后-------" << endl;
//给英雄装备武器
hero = new WujinKnife(hero);
hero->ShowStatus();
}
int main(void)
{
test01();
system("pause");
return 0;
}
当你难受的时候,你要知道,你还有为自己鼓掌的时候
相关文章
- C++按位异或运算符
- 水仙花数 -- C++ 实现
- Cu002FC++ 中的数组
- C++结构体和类的区别_c++有结构体吗
- C/C++ Qt 数据库与TreeView组件绑定
- C/C++ 实现内存特征码搜索
- c 线程安全的单例模式-std string与线程安全_这才是现代C++单例模式简单又安全的实现
- C++ 构造函数的运用,继承、派生时的重载方式
- C++ 实现多线程生产者消费者模式
- 基于C++的归并排序、快速排序、希尔排序对比测试
- 【C++】通过stack、queue、deque理解适配器模式
- c++面向对象设计(谭浩强)2.3类的成员函数
- C++中的单例模式(普通,2B,文艺)
- C++中的单例模式介绍
- 深入解析C++DataMember内存布局