装饰器模式(C++)

embedded/2024/10/15 3:41:11/

定义:装饰器模式(Decorator Pattern)是一种结构型设计模式,它允许你向一个现有的对象添加新的功能,同时又不改变其结构。这种类型的设计模式属于对象结构型模式,它是通过创建一个包装对象,也就是装饰器,来包裹真实的对象。

        代码:

// 抽象构件角色  
class Component {  
public:  virtual ~Component() = default;  virtual void Operation() const = 0;  
};  // 具体构件角色  
class ConcreteComponent : public Component {  
public:  void Operation() const override {  std::cout << "ConcreteComponent" << std::endl;  }  
};  // 抽象装饰器角色  
class Decorator : public Component {  
protected:  std::shared_ptr<Component> component;  public:  Decorator(std::shared_ptr<Component> comp) : component(comp) {}  void Operation() const override {  component->Operation();  }  
};  // 具体装饰器角色A  
class ConcreteDecoratorA : public Decorator {  
public:  ConcreteDecoratorA(std::shared_ptr<Component> comp) : Decorator(comp) {}  void Operation() const override {  Decorator::Operation(); // 调用被装饰对象的Operation()  AddedBehavior();        // 调用附加行为  }  void AddedBehavior() const {  std::cout << "ConcreteDecoratorA - Added Behavior" << std::endl;  }  
};  // 具体装饰器角色B  
class ConcreteDecoratorB : public Decorator {  
public:  ConcreteDecoratorB(std::shared_ptr<Component> comp) : Decorator(comp) {}  void Operation() const override {  AddedBehavior();        // 调用附加行为  Decorator::Operation(); // 调用被装饰对象的Operation()  }  void AddedBehavior() const {  std::cout << "ConcreteDecoratorB - Added Behavior" << std::endl;  }  
};  int main() {  // 创建具体构件对象  auto concreteComponent = std::make_shared<ConcreteComponent>();  // 创建装饰器对象并装饰具体构件对象  auto decoratorA = std::make_shared<ConcreteDecoratorA>(concreteComponent);  auto decoratorB = std::make_shared<ConcreteDecoratorB>(decoratorA);  // 执行被装饰后的对象的方法  decoratorB->Operation();  return 0;  
}


http://www.ppmy.cn/embedded/127673.html

相关文章

若依-医疗系统

项目介绍 湘雅三医院医疗系统是根据长沙市湘雅第三医院来开发的一款后台管理系统&#xff0c;是基于SpringBoot和Vue2开发的一款前端后端分离项目&#xff0c; 项目中包括&#xff1a;1&#xff1a;权限认证&#xff0c;动态菜单2&#xff1a;用户管理&#xff0c;部门管理&am…

【Linux】命令行下的增删查改之“查找“

根据路径和条件搜索指定文件(find) find 命令是 Linux 系统中一个极为重要和强大的工具&#xff0c;用于在目录树中递归查找文件和目录&#xff0c;能够根据多个条件进行筛选。 它适用于进行系统维护、文件管理和日志分析时文件的搜寻,既然其查找方式递归且从根目录开始,所以…

Spring MVC接收参数方式

1. 使用 RequestParam RequestParam 注解用于将请求中的参数绑定到控制器方法的参数上。 基本用法 GetMapping("/example") public String example(RequestParam("paramName") String param) {// 处理 paramreturn "result"; }可选参数 可以…

【笔记】408刷题笔记

文章目录 三对角三叉树求最小带权路径UDP报文首部和TCP报文首部IP报文首部TCP报文首部UDP报文首部 刷新和再生的区别地址译码 为了区分队空队满&#xff0c;可以使用三种处理方式 1&#xff09;牺牲一个单元 队头指针在队尾指针的下一位置作为队满的标志 队满条件&#xff1a;(…

FPGA驱动HDMI 初级篇

简介 本章节主要讲述如何通过FPGA驱动HDMI显示。 本章节框图如下: bd框图中使用了两个IP核,分别是Video Timing controller核AXI4-Stream to video out两个模块,下面先对两个模块做介绍。 Video Timing controller 配置如下: 这里由于没有使用ZYNQ PS端,…

[蓝桥杯 2017 省 B] 日期问题

小明正在整理一批历史文献。这些历史文献中出现了很多日期。小明知道这些日期都在 1960 年 1 月 1 日至 2059 年 12 月 31 日。令小明头疼的是&#xff0c;这些日期采用的格式非常不统一&#xff0c;有采用年/月/日的&#xff0c;有采用月/日/年的&#xff0c;还有采用日/月/年…

【题解】【动态规划01背包问题】—— [NOIP2012 普及组] 摆花

【题解】【动态规划01背包问题】—— [NOIP2012 普及组] 摆花 [NOIP2012 普及组] 摆花题目描述输入格式输出格式输入输出样例输入 #1输出 #1 提示 解法1.二维 d p dp dp1.1.思路解析1.2.AC代码 解法2.一维 d p dp dp2.1.思路解析2.2.AC代码 3.扩展:前缀和优化 [NOIP2012 普及组…

互联网IT行业最“烫手”的六大证书!

PMP&#xff08;项目管理专业人员资格认证&#xff09; 报名条件&#xff1a;本科学历3年项目经验 考试时间&#xff1a;一年4次考试&#xff0c;分别在3、6、8、11各举行一次考试。 就业前景&#xff1a;适合IT项目经理、项目管理、助理、专员、产品经理等职位 含金量: 部…