当前位置: 首页 > news >正文

C++常用23种设计模式总结(三)------装饰模式

往期回顾
C++常用23种设计模式总结(一)------单例模式
C++常用23种设计模式总结(二)------观察者模式

什么是装饰模式

装饰模式是一种结构型设计模式,它允许你在运行时为对象动态添加新的行为。该模式通过将对象放入包装器中来实现这一点,这个包装器会实现与被包装对象相同的接口,并且会将所有方法的调用委派给被包装对象。同时,包装器还可以定义一些额外的行为,例如添加新的方法或修改现有方法的行为。

装饰模式的主要优点是它允许你在不修改现有代码的情况下扩展对象的功能。这使得代码更加灵活和可维护,因为你可以通过添加新的装饰器来实现新的功能,而不必修改现有的代码。此外,装饰模式还遵循开闭原则,因为它允许你在不修改现有代码的情况下添加新的功能。

然而,装饰模式也有一些缺点。首先,由于每个装饰器都需要实现与被包装对象相同的接口,因此可能会导致类的数量增加。此外,由于装饰器可以嵌套,因此可能会导致代码变得复杂和难以理解。最后,装饰模式可能会导致性能下降,因为每个方法调用都需要经过多个装饰器的处理。

参考代码

#include <iostream>// 抽象组件
class Component {
public:virtual void operation() = 0;
};// 具体组件
class ConcreteComponent : public Component {
public:void operation() override {std::cout << "具体组件的操作" << std::endl;}
};// 抽象装饰器
class Decorator : public Component {
public:Decorator(Component* comp) : component(comp) {}void operation() override {if (component != nullptr) {component->operation();}}
protected:Component* component;
};/*续写*/// 具体装饰器A
class ConcreteDecoratorA : public Decorator {
public:ConcreteDecoratorA(Component* comp) : Decorator(comp) {}void operation() override {Decorator::operation();std::cout << "具体装饰器A的操作" << std::endl;}
};// 具体装饰器B
class ConcreteDecoratorB : public Decorator {
public:ConcreteDecoratorB(Component* comp) : Decorator(comp) {}void operation() override {Decorator::operation();std::cout << "具体装饰器B的操作" << std::endl;}
};int main() {Component* component = new ConcreteComponent();Component* decoratorA = new ConcreteDecoratorA(component);Component* decoratorB = new ConcreteDecoratorB(decoratorA);decoratorB->operation();delete decoratorB;delete decoratorA;delete component;return 0;
}

运行结果

具体组件的操作
具体装饰器A的操作
具体装饰器B的操作
http://www.lryc.cn/news/148700.html

相关文章:

  • 选择O型圈时要考虑哪些因素?
  • 安全管理中心技术测评要求项
  • Hibernate(Spring Data)抓取策略
  • 【高阶数据结构】map和set的介绍和使用 {关联式容器;键值对;map和set;multimap和multiset;OJ练习}
  • 系统架构技能之设计模式-单件模式
  • Redis进阶 - JVM进程缓存
  • SD-WAN带您告别高成本、单一功能和安全性差
  • 面试必备:揭秘ArrayList和LinkedList,区别、优缺点与使用场景
  • 【局部活动轮廓】使用水平集方法实现局部活动轮廓方法研究(Matlab代码实现)
  • Git 同步远程新的同名分支
  • PingCode DevOps 团队:企业CICD流水线可能会遇到的问题及解法
  • 【LeetCode题目详解】第九章 动态规划part01 509. 斐波那契数 70. 爬楼梯 746. 使用最小花费爬楼梯 (day38补)
  • 图像处理 信号处理板 设计原理图:367-基于zynq XC7Z100 FMC接口通用计算平台
  • PHP中header()的七种用法
  • 臻图信息以数字孪生技术推动智慧小区数字化建设
  • 15.CSS发光按钮的悬停特效
  • MyBatis —— 动态SQL和缓存
  • 恒流电路的三种设计方案
  • QT基础 关于QT延迟
  • LLM - LLaMA-2 获取文本向量并计算 Cos 相似度
  • 【创建型设计模式】C#设计模式之工厂模式,以及通过反射实现动态工厂。
  • 可拖拽编辑的流程图X6
  • 神经网络与卷积神经网络
  • 《Java极简设计模式》第05章:原型模式(Prototype)
  • OceanBase 4.1解读:读写兼备的DBLink让数据共享“零距离”
  • STM32的HAL库的定时器使用
  • Flink+Paimon多流拼接性能优化实战
  • cocos 2.4 版本 设置物理引擎步长 解决帧数不一致的设备 物理表现不一致问题 设置帧刷新率
  • Spark及其生态简介
  • 从Instagram到TikTok:利用社交媒体平台实现业务成功