C++设计模式-装饰器模式

一、概念

从外部给类添加新职能,而不用去修改原始的类(满足面向对象的开放-封闭原则),扩展性好,可复用程度高。

二、原理

  • Component 为一个抽象对象,装饰器和具体需要被装饰的对象都继承自该抽象对象,最重要的一点是Decrator维护了一个需要被装饰的对象的引用,从而达到为该对象添加职能的目的。
  • demo:为一个蛋糕添加装饰 。蛋糕店刚生产出来的蛋糕是最原始的,只是一个蛋糕原型,我们需要再这个蛋糕上加上奶油,加上巧克力,加上瓜子仁,写上字等,将原始蛋糕作为一个Cake类,我们给这个Cake类的对象作装饰,为了不破坏开放-封闭原则,也为了更好的拓展,我们不能直接在Cake这个类里修改,而应该通过装饰器来给这个蛋糕做装饰。

三、代码实现

1.component.h

component.h 这个文件描述原始对象和需要被装饰的对象

cpp 复制代码
#ifndef DECRATOR_COMPONENT_H
#define DECRATOR_COMPONENT_H
using namespace std;

//定义一个原始的抽象类蛋糕,装饰器的功能是给蛋糕加上各种装饰,如奶油,巧克力,瓜子仁,花生米等
class Cake{
public:
    Cake(){};
    ~Cake(){};

    virtual void showCake() = 0;//纯虚函数
    string m_sName;
};

class ConcreteCake:public Cake{
public:
    ConcreteCake(){
        m_sName = "原始蛋糕";
    }
    ~ConcreteCake(){}

    virtual void showCake()
    {
        cout << m_sName << endl;
    }
};
#endif //DECRATOR_COMPONENT_H

2.decorator.h

decorator.h文件描述具体的装饰器的类

cpp 复制代码
#ifndef DECRATOR_DECORATOR_H
#define DECRATOR_DECORATOR_H
#include "component.h"
class CakeDecorator:public Cake{
public:
    CakeDecorator(){}
    ~CakeDecorator(){}

    virtual void showCake() = 0;

protected:
    Cake *m_pCake;//需要被装饰的对象,为Cake对象添加装饰
};

class CakeDecoratorMilk:public CakeDecorator{
public:
    CakeDecoratorMilk(Cake *pCake)
    {
        m_pCake = pCake;
    }
    ~CakeDecoratorMilk(){
    }

    virtual void showCake() {
        m_sName = m_pCake->m_sName + "加奶油";
        cout << m_sName << endl;
    }
};

class CakeDecoratorCholate:public CakeDecorator{
public:
    CakeDecoratorCholate(Cake *pCake){
        m_pCake = pCake;
    }
    ~CakeDecoratorCholate(){}

    virtual void showCake(){
        m_sName = m_pCake->m_sName + "加巧克力";
        cout << m_sName << endl;
    }
};

#endif //DECRATOR_DECORATOR_H

3.main.cpp

cpp 复制代码
#include <iostream>
#include "component.h"
#include "decorator.h"

int main() {
    std::cout << "decorator Mode!" << std::endl;
    ConcreteCake *pConcrete = new ConcreteCake();
    pConcrete->showCake();

    CakeDecoratorMilk *pDecMilk = new CakeDecoratorMilk(pConcrete);
    pDecMilk->showCake();
    CakeDecoratorCholate *pDecCholate = new CakeDecoratorCholate(pConcrete);
    pDecCholate->showCake();

    delete pConcrete;
    delete pDecMilk;
    delete pDecCholate;

    return 0;
}

三、运行结果

相关推荐
Thera77724 分钟前
【Linux C++】彻底解决僵尸进程:waitpid(WNOHANG) 与 SA_NOCLDWAIT
linux·服务器·c++
Wei&Yan28 分钟前
数据结构——顺序表(静/动态代码实现)
数据结构·c++·算法·visual studio code
wregjru44 分钟前
【QT】4.QWidget控件(2)
c++
浅念-1 小时前
C++入门(2)
开发语言·c++·经验分享·笔记·学习
苏渡苇1 小时前
优雅应对异常,从“try-catch堆砌”到“设计驱动”
java·后端·设计模式·学习方法·责任链模式
小羊不会打字1 小时前
CANN 生态中的跨框架兼容桥梁:`onnx-adapter` 项目实现无缝模型迁移
c++·深度学习
Max_uuc1 小时前
【C++ 硬核】打破嵌入式 STL 禁忌:利用 std::pmr 在“栈”上运行 std::vector
开发语言·jvm·c++
近津薪荼1 小时前
dfs专题4——二叉树的深搜(验证二叉搜索树)
c++·学习·算法·深度优先
短剑重铸之日2 小时前
《设计模式》第十一篇:总结
java·后端·设计模式·总结
艾莉丝努力练剑2 小时前
【Linux:文件】Ext系列文件系统(初阶)
大数据·linux·运维·服务器·c++·人工智能·算法