C++设计模式——装饰者模式(Decorator模式)

装饰者模式

概念

  • 装饰者模式是在不必改变原类文件和继承的情况下,动态地扩展一个对象的功能。它是通过创建一个包装对象(装饰器)来动态添加功能的对象
  • 装饰者模式提供了一种给类增加职责的方法,不是通过继承实现的,而是通过组合

UML图

C++设计模式——装饰者模式(Decorator模式)_第1张图片
Component(抽象构件):提供一个抽象接口,以规范准备接收附加装饰的对象。
ConcreteComponent(具体构件):定义一个将要接收附加装饰的类。
Decorator(抽象装饰类):持有一个构件(Component)对象的实例,并实现一个与抽象构件接口一致的接口。
ConcreteDecorator(具体装饰类):负责给构件对象添加上附加的装饰。

举个例子

假设现在有一个食物的抽象类(Component),鱼、肉是它的子类(ConcreteComponent)。
那么此时我想给鱼或者肉添加调料,比如糖、辣、或者 加糖又加辣(ConcreteDecorator)

不使用装饰着模式的类图如下
C++设计模式——装饰者模式(Decorator模式)_第2张图片
如果想要添加新的调料怎么办?此时就会造成类的膨胀和代码冗余等问题

装饰者模式就可以解决这样的问题,使用装饰者模式类图如下
C++设计模式——装饰者模式(Decorator模式)_第3张图片
通过继承食物类,并且在Decorator里存着具体修饰的对象,当需要添加新调料时只需要添加新的装饰类。并且想要添加调料是组合的方式(类似加法),而不使用装饰者模式的情况类的复杂度是以阶乘的方式增加

具体代码实现

食物类

#ifndef _FOOD_H
#define _FOOD_H
#include 
using namespace std;

class Food
{
public:
	virtual void Cooking() = 0;//烹饪

protected:
	Food(){};
	virtual ~Food(){};

};

class Fish :public Food
{
public:
	Fish(){};
	~Fish(){};

	void Cooking()
	{
		cout << "Cooking Fish" << endl;
	}

private:

};

class Meat :public Food
{
public:
	Meat(){};
	~Meat(){};

	void Cooking()
	{
		cout << "Cooking Meat" << endl;
	}

private:

};



#endif

装饰类

#ifndef _DECORATOR_H
#define _DECORATOR_H
#include 
#include "food.h"
using namespace std;

class Decorator : public Food
{
public:
	virtual ~Decorator(){};

protected:
	Decorator(Food* food) :m_food(food){};
	Food* m_food;
};

class SweetDecorator :public Decorator
{
public:
	SweetDecorator(Food* food) :Decorator(food){};//调用基类的构造器
	~SweetDecorator(){};

	void AddSweet()
	{
		cout << "Add Sweet" << endl;
	}

	void Cooking()
	{
		AddSweet();
		m_food->Cooking();
	}

private:

};

class SpicyDecorator :public Decorator
{
public:
	SpicyDecorator(Food* food) :Decorator(food){};//调用基类的构造器
	~SpicyDecorator(){};

	void AddSpicy()
	{
		cout << "Add Spicy" << endl;
	}

	void Cooking()
	{
		AddSpicy();
		m_food->Cooking();
	}

private:

};

#endif

主函数调用

#include 
#include "food.h"
#include "Decorator.h"
using namespace std;


int main()
{
	//创建鱼、肉
	Food* fish = new Fish();
	Food* meat = new Meat();

	//创建装饰器 甜味、辣味
	Decorator* sweetDecorator1 = new SweetDecorator(fish);
	Decorator* spicyDecorator1 = new SpicyDecorator(fish);

	//甜的鱼
	sweetDecorator1->Cooking();
	cout << "*********************" << endl;

	//辣的鱼
	spicyDecorator1->Cooking();
	cout << "*********************" << endl;

	Decorator* sweetDecorator2 = new SweetDecorator(meat);
	Decorator* spicyDecorator2 = new SpicyDecorator(sweetDecorator2);

	//又甜右辣的肉
	spicyDecorator2->Cooking();


	while (1);
	return 0;
}

调用结果
C++设计模式——装饰者模式(Decorator模式)_第4张图片

你可能感兴趣的:(C/C++)