装饰者(Decorator)模式

本文介绍装饰者模式的应用场景及其实现方式,通过一个具体的例子——为手机添加功能,展示了如何利用该模式逐步添加职责,避免类的职责过度膨胀。装饰者模式能够有效分离核心职责与装饰功能。

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

装饰者模式

常用在为已经定义好的类添加新的职责(操作),通常我们会定义一个新类继承自定义好的类,随之而来的问题是当具体子类要添加新的职责时,就要向其父类添加这个职责的抽象接口,这样当子类越多,其父类的抽象接口越多,而且继承自这个父类的所有子类都不可避免的继承了父类的接口。Decorator模式提供了一种解决方法,当添加操作时一步步的添加新的职责。

举个栗子: 手机的主要功能是上网Web,现在手机升级,我需要加入打电话Call功能。我们将其抽象到基类Function中,为了以后同类问题的可扩展,将Web等附加功能抽象成Decorator,Decorator派生自Function,其内部却有着依附的主体功能Function *pmain_.

Decorator

如此, 我们将可以新职责一层层的添加进去,我们将类的装饰功能从类中剥离出去,以简化原有的类。我们甚至同过不同的装饰次序,来改变类的行为。

可以有效地将核心职责与装饰功功能区分开来,并且抽象出了重复的装饰逻辑。

//decorator.hpp

#include <iostream>
#ifndef _DESIGN_PATTERN_DECORATOR_DECORATOR_HPP_
#define _DESIGN_PATTERN_DECORATOR_DECORATOR_HPP_

namespace design_pattern
{

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

class Call : public Function
{
public:
	void Operation()
	{
		std::cout << "Calling... ...!" << std::endl;
	}
};

class Decorator : public Function
{
protected:
	Function *pmain_;

public:
	void set_pmain(Function * const &ptr)
	{
		pmain_ = ptr;
	}

	virtual void Operation() = 0;
};

class Web : public Decorator
{
public:
	void Operation()
	{
		std::cout << "Browse Web Page... ...!" << std::endl;
		if (nullptr != pmain_)
			pmain_->Operation();
	}
};
}

#endif // !_DESIGN_PATTERN_DECORATOR_DECORATOR_HPP_

// decorator_main.cpp

#include "decorator.hpp"
using namespace design_pattern;

int main()
{
	Call c;
	Web w;
	Decorator *pd = dynamic_cast<Decorator *>(&w);
	pd->set_pmain(dynamic_cast<Cellphone *>(&c));
	pd->Operation();

	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值