概念
装饰模式是一种结构形模式,允许通过将对象放入包含行为的特殊封装对象(装饰器)中来为原来对象(组件)绑定新的行为。
适用场景
1、如果希望在无需修改代码的情况下即可使用对象,且希望在运行时为对象新增额外的行为,可使用装饰模式。
2、如果用继承来扩展对象行为的方案难以实现或者根本不可行,就可以使用该模式。
实现方式
1、确保业务逻辑可用一个基本组件(组件对象)及多个额为可选层次(装饰器对象)表示。
2、找出基本组件和可选层次的通用方法,创建一个组件接口并在其中声明这些方法。
3、创建一个具体组件类,并定义其基础行为。
4、创建装饰类,使用一个成员变量存储指向被封装对象的引用。该成员变量必须被声明为组件接口类型,从而能在运行的时候连接具体组件和装饰。装饰基类必须将所有工作委派该被封装的对象。
5、确保所有类实现组件接口。
6、将装饰基类扩展为具体装饰,具体的装饰必须在调用父类方法之后或者之前执行具体的自身行为。
7、客户端代码负责创建装饰并将其组合成客户端所需的形式。
类结构关系
代码示例
#include "ZhuangShiMoShi.h"
int main()
{
std::cout << "欢迎东哥来到设计模式的世界!\n";
//创建基本组件
ModuleInterface* module = new Module();
module->baseFun();
//给装饰器添加基本组件,拓展基本组件的功能
Decoration decoration;
decoration.setModule(module);
decoration.baseFun();
}
#pragma once
#include <iostream>
using namespace std;
//组件接口
class ModuleInterface
{
public:
ModuleInterface() {}
~ModuleInterface() {}
virtual void baseFun() {};
};
//组件类,实现组件的基本功能
class Module:public ModuleInterface {
public:
Module() {}
~Module() {}
void baseFun() {
cout << "module fun:组件的基本操作" << endl;
}
};
class Decoration :public ModuleInterface {
public:
Decoration() {}
~Decoration() {}
void baseFun() {
cout << "Decoration fun:装饰器的拓展功能" << endl;
if (m_modeinterface) {
m_modeinterface->baseFun();
}
}
void setModule(ModuleInterface* module) {
if (module) {
m_modeinterface = module;
}
}
private:
ModuleInterface* m_modeinterface = nullptr;
};