设计模式(十五)装饰模式 C++

意图:动态地给一个对象添加一些额外的职责。就增加功能来说,装饰器模式相比生成子类更为灵活。

好处就是把核心功能和装饰功能区分开来了

(要想真正理解装饰模式的代码实现,首先要理解多态的实现)

装饰模式主要包含以下角色。

  1. 抽象构件(Component)角色:定义一个抽象接口以规范准备接收附加责任的对象。
  2. 具体构件(Concrete    Component)角色:实现抽象构件,通过装饰角色为其添加一些职责。
  3. 抽象装饰(Decorator)角色:继承抽象构件,并包含具体构件的实例,可以通过其子类扩展具体构件的功能。
  4. 具体装饰(ConcreteDecorator)角色:实现抽象装饰的相关方法,并给具体构件对象添加附加的责任。

    在下面的demo中,手机作为抽象构件,iPhone 和Nokia 作为具体构件,DecoratorPhone作为抽象装饰,

DecoratorPhoneA,DecoratorPhoneB作为具体装饰,一个代表挂件,一个代码贴膜。

装饰模式的技术思想是:通过多态性调用各个装饰

 

 

#include <iostream>
#include <windows.h>
using namespace std;

//公共抽象类
class Phone
{
public:
	Phone()
	{}
	virtual ~Phone() 
	{}
	virtual void ShowDecorate() 
	{}
};

//具体的手机类
class iPhone : public Phone
{
private:
	string m_name; //手机名称
public:
	iPhone(string name) : m_name(name)
	{}
	~iPhone() 
	{}
	void ShowDecorate()
	{ 
		cout << m_name.c_str() << "		的装饰" << endl; 
	}
};

//具体的手机类
class NokiaPhone : public Phone
{
private:
	string m_name;
public:
	NokiaPhone(string name) : m_name(name) 
	{}
	~NokiaPhone()
	{}
	void ShowDecorate()
	{ 
		cout << m_name.c_str() << "		的装饰" << endl;
	}
};

//装饰类
class DecoratorPhone : public Phone
{

public:
	DecoratorPhone(Phone *phone) : m_phone(phone) 
	{}
	virtual void ShowDecorate() 
	{ 
		m_phone->ShowDecorate(); 
	}

private:
	Phone *m_phone;  //要装饰的手机
};

//具体的装饰类
class DecoratorPhoneA : public DecoratorPhone
{
public:
	DecoratorPhoneA(Phone *phone) : DecoratorPhone(phone)
	{}
	void ShowDecorate() 
	{ 
		DecoratorPhone::ShowDecorate();
		AddDecorate(); 
	}
private:
	//增加的装饰
	void AddDecorate() 
	{ 
		cout <<		"增加挂件" << endl; 
	}
};

//具体的装饰类
class DecoratorPhoneB : public DecoratorPhone
{
public:
	DecoratorPhoneB(Phone *phone) : DecoratorPhone(phone) {}
	void ShowDecorate() 
	{
		DecoratorPhone::ShowDecorate(); 

		AddDecorate(); 
	}
private:
	//增加的装饰
	void AddDecorate() 
	{ 
		cout << "屏幕贴膜" << endl;
	} 
};

int main()
{
	Phone *pNokia = new NokiaPhone("Nokia6300");
	Phone *pPendant = new DecoratorPhoneA(pNokia); //装饰,增加挂件
	Phone *pPatch = new DecoratorPhoneB(pPendant);    //装饰,屏幕贴膜
	pPatch->ShowDecorate();

	delete pPendant;
	delete pPatch;
	delete pNokia;


	system("pause");
	return 0;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
装饰器模式(Decorator Pattern)是一种结构型设计模式,它允许向一个现有的对象添加新的功能,同时又不改变其结构。这种模式通过创建一个装饰类来包装原始的类,从而实现动态地扩展一个对象的功能。装饰类和被装饰类可以独立发展,它们之间没有耦合关系。装饰器模式是继承的一个替代模式,它避免了使用继承来扩展对象功能所带来的静态特性。 在C++中,可以通过使用抽象类和具体类来实现装饰器模式。首先创建一个抽象类(比如Shape)作为基类,然后创建具体的类(比如Circle和Rectangle)作为子类。这些子类实现了抽象类中的纯虚函数(比如draw),分别表示不同的图形。 在使用装饰器模式时,我们可以创建一个装饰类,它也是抽象类的子类,并且它的对象包含一个抽象类对象的指针。装饰类可以在原始对象的基础上添加额外的功能,同时保持原始对象的接口不变。通过使用装饰器模式,我们可以动态地扩展一个对象的功能,而无需修改原始对象的结构。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [C++设计模式:装饰器模式](https://blog.csdn.net/m0_73443478/article/details/129751085)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值