设计模式-第三章-装饰模式

本文详细介绍了装饰模式的概念及其在软件设计中的应用。通过具体实例讲解如何动态地给对象添加职责,对比生成子类的方式,装饰模式提供了更为灵活的解决方案。

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

一、UML图

二、包含的角色

(1)Component是一个对象接口,可以给对象动态的添加职责

(2)ConcreteComponent  定义了一个具体的类,可以给这个类添加一些职责

(3)Decorater 为装饰的抽象类,继承了Component,从外类来扩展Component的功能,但对于Component来说。是无需知道Decorater的存在的

(4)ConcreteDecorater为装饰的具体类,起到给Component添加职责的功能。

三、特点

 定义:装饰模式(Decorater),动态的给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更为灵活。

(1)装饰模式是为已有功能动态的添加更多功能的一种方式

(2)当系统需要新功能的时候,是向旧的类中添加新的代码,这些代码通常装饰了原有类的核心职责或主要行为。在主类中加入新的字段,新的方法和新逻辑,增加了主类的复杂度,但是这些新加入的东西仅仅是为了满足 一些只在某种特定 情况下才会执行的特殊行为的需求。而装饰模式提供了一种好的解决方案,把每个需要装饰的功能封装在单独的类中,并让这个类去包装它所要装饰的对象,因此,执行特殊行为时候,客户代码就可以在运行时根据需要,选择的,按顺序的使用装饰功能包装对象。

优点:把类的装饰功能从类中搬走,降低了主类的复杂度,有效的将类的核心功能和修饰功能分离,而且可以去除相关类中重复的修饰逻辑。

使用场合:

(1)需要在内部组装完成显示出来的情况。

(2)装饰模式的建造过程不稳定。

(3)我们需要把所需的功能按正确的顺序串联起来进行控制。

四、代码实现

Component类

class Component
{
public:
	virtual void Operation() = 0;
};

ConcreteComponent类

class ConcreteComponent : public Component
{
public:
	void Operation();
};

Dectorater类

Dectorater.h

#include "Component.h"

class Decorater : public Component
{
private:
	Component* _component;
public:
	void Operation();
	void SetComponent(Component* component);
};

Dectorater.cpp

#include "Decorater.h"

void Decorater::Operation()
{
	if (_component!=NULL)
	{
		_component->Operation();
	}
}

void Decorater::SetComponent(Component * component)
{
	_component = component;
}

ConcreteDecorater类

#include "Decorater.h"

class ConcreteDecoraterA : public Decorater
{
public:
	void Operation();
private:
	int Attribute;
};
void ConcreteDecoraterA::Operation()
{
	Decorater::Operation();
	printf("2");
}

调用方式

#include "ConcreteComponent.h"
#include "ConcreteDecoraterA.h"
#include "ConcreteDecoraterB.h"

int main()
{
	ConcreteComponent* cC = new ConcreteComponent();
	ConcreteDecoraterA* cDa = new ConcreteDecoraterA();
	ConcreteDecoraterB* cDb = new ConcreteDecoraterB();

	cDa->SetComponent(cC);
	cDb->SetComponent(cDa);
	cDb->Operation();

    delete cDb;
    delete cDa;
    delete cC;
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值