C++装饰模式(Decorator Pattern)

意图

装饰模式就是对一个对象进行装饰,换句话说,就是对一个对象增加额外的功能。

需求

一位美女早上起来化妆,需要打粉底、画眉毛、涂口红、带耳环等过程。

需求分析

面对这样的需求,可以用单纯的添加方法,这是不可取的。如果遇到这位美女第二天想换另外一种方式,那怎么办呢?设计模式的根本目的及时实现高内聚、低耦合,这样对于编程来说,装饰模式是一个不错的选择。

参与者

1、Component

定义一个对象的接口

2、ConcreteComponent

一个Component的具体对象,可以给这个对象添加一些职责

3、Decorator

定义一个接口,这个Decorator即继承Component,又聚合Component,或句话说,就是需要继承Component,又拥有一个Component的属性

4、CocnreteDecorator

一个Decorator的具体对象,进行装饰模式的执行过程

UML类图

在这里插入图片描述

编码实现过程

本人已经在Visual Studio 2013上亲测,完全可以运行
#include <iostream>
#include <string>

class Component
{
public:
	virtual std::string dress() = 0;
	virtual ~Component(){}
};

class ConcreteComponent :public Component
{
public:
	std::string dress()override
	{
		return "化妆:";
	}
};

class Decorator :public Component
{
public:
	Decorator(Component* cmp) :m_cmp(cmp){}
	virtual std::string dress() = 0;

protected:
	Component* m_cmp;
};

class ConcreteDecoratorA :public Decorator
{
public:
	ConcreteDecoratorA(Component* cmp) :Decorator(cmp){}
	std::string dress()override
	{
		return m_cmp->dress() + "  打粉底";
	}
};

class ConcreteDecoratorB :public Decorator
{
public:
	ConcreteDecoratorB(Component* cmp) :Decorator(cmp){}
	std::string dress()override
	{
		return m_cmp->dress() + "  涂口红";
	}
};

class ConcreteDecoratorC :public Decorator
{
public:
	ConcreteDecoratorC(Component* cmp) :Decorator(cmp){}
	std::string dress()override
	{
		return m_cmp->dress() + "  带耳环";
	}
};

class ConcreteDecoratorD :public Decorator
{
public:
	ConcreteDecoratorD(Component* cmp) :Decorator(cmp){}
	std::string dress()override
	{
		return m_cmp->dress() + "  刷眉毛";
	}
};

//内存释放
#ifndef DELETE
#define DELETE(p) {if(p){delete(p);(p)=nullptr;}}
#endif

int main(int argc, char* argv[])
{

	Component* woman = new ConcreteComponent();
	Component* a = new ConcreteDecoratorA(woman);
	Component* b = new ConcreteDecoratorB(a);
	Component* c = new ConcreteDecoratorC(b);
	Component* d = new ConcreteDecoratorD(c);
	std::cout << d->dress() << std::endl;

	DELETE(d);
	DELETE(c);
	DELETE(b);
	DELETE(a);
	DELETE(woman);

	system("pause");
	return 0;
}
本人不才,能力有限,如果你有什么疑问,完全可以在下方评论留言,我定会回复。大象相互学习,共同进步
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值