【设计模式之装饰器模式 -- C++】

7.装饰器模式 -- 包装对象,增强功能

装饰模式指的是在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能。它是通过创建一个包装对象,也就是装饰来包裹真实的对象。百度百科

1)设计原则 -- 抽象父类,子类实现
  1. 多组合,少继承。
    利用继承设计子类的行为,是在编译时静态决定的,而且所有的子类都会继承到相同的行为。然而,如果能够利用组合的做法扩展对象的行为,就可以在运行时动态地进行扩展。
  2. 类应设计的对扩展开放,对修改关闭。
2)优点

1.decorator模式与继承关系的目的都是要扩展对象的功能,但是decorator可以提供更多的灵活性

2。通过使用不同的具体装饰类以及这些装饰类的排列组合,设计师可以创造出很多不同行为的组合。

3)缺点

1.更多的复杂性

2.设计中会出现很多小类,过度使用,会使程序更复杂。

4)实现
cpp 复制代码
// 装饰器模式
// 时间:2024-2-1
// 作者:@conceal
#include <iostream>
#include <string>
using namespace std;

class Component
{
public:
    virtual void Operation() = 0;
};

class ConcreteComponent : public Component
{
public:
    void Operation()
    {
        cout << "ConcreteComponent operation..." << endl;
    }
};

class Decorator : public Component
{
public:
    Decorator(Component* component) : m_component(component) {}
    void Operation()
    {
        m_component->Operation();
    }
private:
    Component* m_component;
};

class ConcreteDecoratorA : public Decorator
{
public:
    ConcreteDecoratorA(Component* component) : Decorator(component) {}
    void Operation()
    {
        Decorator::Operation();
        AddedBehavior();
        cout << "ConcreteDecoratorA operation..." << endl;
    }
    void AddedBehavior()
    {
        cout << "ConcreteDecoratorA added behavior..." << endl;
    }
};

class ConcreteDecoratorB : public Decorator
{
public:
    ConcreteDecoratorB(Component* component) : Decorator(component) {}
    void Operation()
    {
        Decorator::Operation();
        AddedBehavior();
        cout << "ConcreteDecoratorB operation..." << endl;
    }
    void AddedBehavior()
    {
        cout << "ConcreteDecoratorB added behavior..." << endl;
    }
};

int main()
{
    Component* component = new ConcreteComponent();
    Decorator* decoratorA = new ConcreteDecoratorA(component);
    Decorator* decoratorB = new ConcreteDecoratorB(decoratorA);
    decoratorB->Operation();
    delete decoratorB;
    delete decoratorA;
    delete component;
    return 0;
}
相关推荐
lapiii3581 小时前
[智能体设计模式] 第4章:反思(Reflection)
人工智能·python·设计模式
Molesidy7 小时前
【VSCode】【Clangd】Win下的基于LLVM/Clangd+Clangd插件+MINGW+CMake的VSCode配置C/C++开发环境的详细教程
c++·ide·vscode·clangd·llvm
Mr_WangAndy8 小时前
C++_chapter13_C++并发与多线程_多线程概念,死锁,unique_lock(),lock_guard()使用
c++·lock·死锁·并发与多线程·unlock·lock_guard·unique_lock
小欣加油8 小时前
leetcode 946 验证栈序列
c++·算法·leetcode·职场和发展
神仙别闹8 小时前
基于QT(C++) 实现哈夫曼压缩(多线程)
java·c++·qt
无敌最俊朗@9 小时前
C++ 并发与同步速查笔记(整理版)
开发语言·c++·算法
神仙别闹10 小时前
基于 C++和 Python 实现计算机视觉
c++·python·计算机视觉
眠りたいです11 小时前
基于脚手架微服务的视频点播系统-客户端业务逻辑处理部分(三)-客户端主体部分完结
c++·微服务·云原生·架构·json·restful·qt6.7
Elnaij11 小时前
从C++开始的编程生活(12)——vector简单介绍和迭代器
开发语言·c++
GISer_Jing11 小时前
OSG底层从Texture读取Image实现:readImageFromCurrentTexture
前端·c++·3d