《大话设计模式》读书笔记之C++实现--chapter6装饰模式

本文详细介绍了装饰模式的概念及其在C++中的实现方式。装饰模式通过在不改变现有代码的情况下为对象添加新功能,使得代码更加灵活且易于扩展。文章通过一个具体的示例程序展示了如何使用装饰模式来动态添加功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


1、UML类图



2、UML类图详解

装饰模式的结构主要有四个元素:

--抽象组件:Component

--具体组件:ConcreteComponent

--抽象装饰组件:Decorator

--具体装饰组件:ConcreteDecorator

装饰模式的三个主要特点为:

--具体组件和装饰组件都继承于抽象组件

--装饰组件有抽象组件的指针或引用(Component*)

--使用装饰组件和具体组件可以创造出新的类


3、使用场合

为已有功能动态添加更多功能的一种方式,当加入的新功能仅仅是为了满足一些只在某种特定情况才会执行的特殊行为的需要,但在原类中加入新代码会增加原类的复杂度。装饰模式把每个要装饰的功能放在单独的类中,并让这个类包装他所需要修饰的对象,因此当需要执行特殊行为时,客户代码就可以在运行时根据需要有选择地、按顺序地使用修饰功能包装对象。有效地把类的核心职责和装饰功能分开了,而且可以去除类中重复的装饰逻辑。

用形象话的语言理解装饰模式就是把抽象组件看成一个人类,具体组件可以是小明,现在我想为小明穿上衬衣,西服,皮鞋,领带...可扩展的类,但是核心的人类保持不变,体现了依赖倒置原则--即对内“封闭”,对外“开放”。装饰模式一般用在核心功能保持不变但是装饰功能可以动态的增加或者选择性地调用。以下示例程序的执行结构如图:


4、C+代码实现



#include<iostream>
#include<string>
using namespace std;

//根据UML类图创建的装饰模式的类
class Component {
public:
	virtual void operation() = 0;
};

class ConcreteComponent :public Component {
public:
	virtual void operation()
	{
		cout << "I'm no decorator ConcreteComponent" << endl;
	}
};

class Decorator :public Component {
public:
	Decorator(Component* pComponent) :m_pComponent(pComponent) {}
	virtual void operation()
	{
		if (m_pComponent != NULL)
			m_pComponent->operation();
	}
protected:
	Component* m_pComponent;
};

class ConcreteDecoratorA :public Decorator {
public:
	ConcreteDecoratorA(Component *pDecorator) : Decorator(pDecorator) {}
	virtual void operation()
	{
		Addoperation();
		Decorator::operation();
	}
	void Addoperation()
	{
		cout << "I'm add operationA" << endl;
	}
};

class ConcreteDecoratorB :public Decorator {
public:
	ConcreteDecoratorB(Component *pDecorator) : Decorator(pDecorator) {}
	virtual void operation()
	{
		Addoperation();
		Decorator::operation();
	}
	void Addoperation()
	{
		cout << "I'm add operationB" << endl;
	}
};

//主程序
int main()
{
	Component *pComponentObj = new ConcreteComponent();
	Decorator *pDecoratorAOjb = new ConcreteDecoratorA(pComponentObj);
	pDecoratorAOjb->operation();
	cout << "=============================================" << endl;
	Decorator *pDecoratorBOjb = new ConcreteDecoratorB(pComponentObj);
	pDecoratorBOjb->operation();
	cout << "=============================================" << endl;
	Decorator *pDecoratorBAOjb = new ConcreteDecoratorB(pDecoratorAOjb);
	pDecoratorBAOjb->operation();
	cout << "=============================================" << endl;
	delete pDecoratorBAOjb;
	pDecoratorBAOjb = NULL;
	delete pDecoratorBOjb;
	pDecoratorBOjb = NULL;
	delete pDecoratorAOjb;
	pDecoratorAOjb = NULL;
	delete pComponentObj;
	pComponentObj = NULL;

	system("pause");
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值