结构型模式----装饰模式(C++)

结构型模式----装饰模式

装饰模式:在不改变现有对象结构的情况下,动态的给对象增加一些额外功能

实现和结构
模式结构
  • 抽象构件:给出一个抽象接口,以规范准备接受附加责任的对象
  • 具体构件:实现抽象构件,通过装饰角色为其添加新的功能
  • 抽象装饰:继承抽象构件,并包含具体构件的实例,可以通过其扩展具体构件的功能
  • 具体装饰:实现抽象装饰的相关方法,并给具体构件对象添加附加的责任
装饰模式的UML类图

在这里插入图片描述

模式使用场景
  1. 需要拓展一个类的功能,或者给一个类添加附加功能
  2. 需要动态的给一个对象添加功能,这些功能可以动态的撤销
  3. 需要通过对现有的一组基本功能进行动态组合而产生多种复合功能时(继承实现较为困难)
模式特点
优点
  • 装饰模式和继承都能拓展对象的功能,装饰模式更加灵活
  • 无需创建新的子类即可拓展对象的行为
缺点
  • 装饰模式会导致设计中出现许多小类,会使程序变得更加复杂
装饰模式实例
#include <iostream>
using namespace std;

//抽象构件:奥特曼
class AbstractAltman
{
public:
	virtual void showSkill() {}
public:
	int skillNum;	//技能数量
};

//具体构件:迪迦奥特曼
class DijiaAltman : public AbstractAltman
{
public:
	virtual void showSkill()
	{
		this->skillNum = 2;
		cout << "我是迪迦奥特曼,我会变身和打怪兽!!!" << endl;
	}
};

//抽象装饰:变身
class Change : public AbstractAltman
{
public:
	AbstractAltman* Altman;
	Change(AbstractAltman* DijiaAltman) {
		this->Altman = DijiaAltman;
	}

	virtual void showSkill() {}

};

//具体装饰:红色模式
class redChange : public Change 
{
public:
	redChange(AbstractAltman* Altman) : Change(Altman) {}
	//增加额外功能
	void changeRed()
	{
		//掌握变身红色,技能数量+1
		this->skillNum = this->Altman->skillNum+1;
		cout << "奥特曼变成了红色模式!!!" << endl;
	}
	void showSkill()
	{
		changeRed();
		cout << this->skillNum << endl;
	}
};

//具体装饰:紫色模式
class purpleChange : public Change
{
public:
	purpleChange(AbstractAltman* Altman) : Change(Altman) {}
	//增加额外功能
	void changePurple()
	{
		//掌握变身紫色,技能数量+1
		this->skillNum = this->Altman->skillNum+1;
		cout << "奥特曼变成了紫色模式!!!" << endl;
	}
	void showSkill()
	{
		changePurple();
		cout << this->skillNum << endl;
	}
};

int main()
{
	AbstractAltman* Dijia = new DijiaAltman;
	Dijia->showSkill();

	cout << "===============" << endl;

	Dijia = new redChange(Dijia);
	Dijia->showSkill();

	cout << "===============" << endl;

	Dijia = new purpleChange(Dijia);
	Dijia->showSkill();

	cout << "===============" << endl;

	system("pause");
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值