C++设计模式——装饰模式(decorator pattern)

一、原理讲解

C++设计模式——装饰模式(decorator pattern)_第1张图片 图1  装饰者模式UML图

1.1意图

装饰模式目的是:动态地给一个对象添加一些额外的职责,比生成子类更灵活。

1.2常用场景

一般用于给某个对象添加某个功能,但是又不希望更改该对象底层抽象借口,同时该功能可以动态增删,这时可以考虑用装饰者模式。

1.3实现方法

如图1所示,装饰着Decorator通过继承抽象基类Component,又组合一个Component指针*component,通过重写从Component继承而来的虚函数operation(),在里面用指针调用operation()函数,即component->operation(),通过运行时绑定,由编译器决定调用的是ConcreteComponent的operation函数。

这样就实现了在装饰者Decorator对象里调用兄弟类的方法,主要原理是依赖C++的多态特性,运行时确定基类指针指向的函数。

二、代码实现

2.1代码实现思路

a1 实现抽象基类Component和一个接口,即虚函数operation();

a2 具体类ConcreteComponent继承Component,实现接口函数operation();

a3 我们的目的是要在另一个装饰类中增加功能operation,所以需要先实现一个抽象装饰者,抽象装饰者增加接口operation(),然后再具体装饰者调用该接口即可。

2.2具体代码示例

#include 

using namespace std;

#define DELETE(pointer) delete pointer;\
pointer=nullptr

struct Component { //抽象基类
	Component(){}
	virtual ~Component(){}

	virtual void operation() = 0; //抽象基类接口
};
struct ConcreteComponent:Component //具体元件类
{
	ConcreteComponent(){}
	~ConcreteComponent() {}

	virtual void operation()override { //实现接口
		cout << "ConcreteComponent" << endl;
	}
};

struct Decorator:Component //抽象装饰者
{
	Decorator(Component *component=nullptr):pComponent(component){}
	~Decorator() {
		if (pComponent) {	//释放内存
			DELETE(pComponent);
		}
	}

	virtual void operation()override {
		if (pComponent) {
			pComponent->operation();
		}
	}

private:
	Component *pComponent;
};
struct ConcreteDecorator:Decorator //具体装饰者
{
	ConcreteDecorator(Component *component):Decorator(component){}
	~ConcreteDecorator(){}

	void addBehavior() {}
};

int main(int argc, char* argv[]){
	//给具体装饰者对象增加了具体元件的功能ConcreteComponent::operation();
	ConcreteDecorator *concreteDecorator = new(std::nothrow) ConcreteDecorator(new(std::nothrow) ConcreteComponent);
	if (concreteDecorator) {
		concreteDecorator->operation();
		DELETE(concreteDecorator);		
	}
	
	system("pause");
	return 1;
}

C++设计模式——装饰模式(decorator pattern)_第2张图片

 

 

参考内容:

https://www.cnblogs.com/bwar/p/9190948.html

https://www.cnblogs.com/cxjchen/p/3161686.html

https://blog.csdn.net/wuzhekai1985/article/details/6672614

你可能感兴趣的:(设计模式)