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

结构型设计模式之装饰模式

文章目录

  • 概述
  • 装饰模式原理
  • 代码案例
  • 小结

概述

装饰模式(decorator pattern) 的原始定义是:动态的给一个对象添加一些额外的职责. 就扩展功能而言,装饰器模式提供了一种比使用子类更加灵活的替代方案。

装饰模式原理

装饰模式中的角色:

  • 抽象构件角色 :它是具体构件和抽象装饰类的共同父类,声明了在具体构件中实现的业务方法.它引进了可以使客户端以一致的方式处理未被装饰的对象以及装饰之后的对象,实现客户端的透明操作
  • 具体构件角色 :它是抽象构件类的子类,用于定义具体的构建对象,实现了在抽象构建中声明的方法,装饰类可以给它增加额外的职责(方法).
  • 抽象装饰角色 :它也是抽象构件类的子类,用于给具体构件增加职责,但是具体职责在其子类中实现.它维护了一个指向抽象构件对象的引用,通过该引用可以调用装饰之前构件对象的方法,并通过其子类扩展该方法,以达到装饰的目的.
  • 具体装饰角色 : 它是抽象装饰类的子类,负责向构件添加新的职责.每一个具体装饰类都定义了一些新的行为,它可以调用在抽象装饰类中定义的方法,并可以增加新的方法用于扩充对象的行为.

代码案例

抽象构建类:

class Context {
public:bool isMgr;// User user;// double groupsale;
};class CalcBonus {    
public:CalcBonus(CalcBonus * c = nullptr) : cc(c) {}virtual double Calc(Context &ctx) {return 0.0; }virtual ~CalcBonus() {}protected:CalcBonus* cc;
};

具体装饰角色:

class CalcMonthBonus : public CalcBonus {
public:CalcMonthBonus(CalcBonus * c) : CalcBonus(c) {}virtual double Calc(Context &ctx) {double mbonus /*= 计算流程忽略*/; return mbonus + cc->Calc(ctx);}
};

下边这个类,不一样的,可以当做管理者角色的计算方法;也就是Context isMgr为true时的计算。

class CalcGroupBonus : public CalcBonus {
public:CalcGroupBonus(CalcBonus * c) : CalcBonus(c) {}virtual double Calc(Context &ctx) {double gbnonus /*= 计算流程忽略*/; return gbnonus + cc->Calc(ctx);}
};

小结

装饰模式动态的给一个对象添加一些额外的职责. 就扩展功能而言,装饰器模式提供了一种比使用子类更加灵活的替代方案。在现实中很常见的,比如不同部门,不同员工工作职责不一样,都是在做同一件事,就可以使用这种方法。OK,翻篇。感兴趣,可以来学习学习。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Web安全技术期末考查-vulhub靶场搭建及漏洞复现
  • 类和对象03
  • 1.int 与 Integer 的简单区别
  • AIGC行业的发展前景与市场需求
  • 软件3班20240527
  • day52
  • 利用element实现简单右键
  • 某安全厂商外包安服工程师面试
  • css绘制下雨的云朵
  • 解决mysql5.7版本中,子查询order by后,对子查询进行group by分组获取最新记录无效的问题
  • LINQ(二) —— 流式语句
  • 【Unity Shader入门精要 第10章】高级纹理(一)
  • 音视频开发—音频相关概念:数模转换、PCM数据与WAV文件详解
  • 一、Nginx详解和安装
  • 翻译《The Old New Thing》- How do I mark a shortcut file as requiring elevation?
  • JS中 map, filter, some, every, forEach, for in, for of 用法总结
  • 「前端早读君006」移动开发必备:那些玩转H5的小技巧
  • CoolViewPager:即刻刷新,自定义边缘效果颜色,双向自动循环,内置垂直切换效果,想要的都在这里...
  • CSS进阶篇--用CSS开启硬件加速来提高网站性能
  • Java,console输出实时的转向GUI textbox
  • javascript 哈希表
  • RedisSerializer之JdkSerializationRedisSerializer分析
  • Spark RDD学习: aggregate函数
  • vue.js框架原理浅析
  • VuePress 静态网站生成
  • vuex 笔记整理
  • 纯 javascript 半自动式下滑一定高度,导航栏固定
  • 从地狱到天堂,Node 回调向 async/await 转变
  • 官方新出的 Kotlin 扩展库 KTX,到底帮你干了什么?
  • 将回调地狱按在地上摩擦的Promise
  • 实习面试笔记
  • 手写双向链表LinkedList的几个常用功能
  • 用简单代码看卷积组块发展
  • #1015 : KMP算法
  • #HarmonyOS:软件安装window和mac预览Hello World
  • #我与Java虚拟机的故事#连载05:Java虚拟机的修炼之道
  • #知识分享#笔记#学习方法
  • $(this) 和 this 关键字在 jQuery 中有何不同?
  • (12)Linux 常见的三种进程状态
  • (12)目标检测_SSD基于pytorch搭建代码
  • (173)FPGA约束:单周期时序分析或默认时序分析
  • (2024,RWKV-5/6,RNN,矩阵值注意力状态,数据依赖线性插值,LoRA,多语言分词器)Eagle 和 Finch
  • (delphi11最新学习资料) Object Pascal 学习笔记---第14章泛型第2节(泛型类的类构造函数)
  • (附源码)ssm教材管理系统 毕业设计 011229
  • (附源码)计算机毕业设计ssm本地美食推荐平台
  • (三分钟了解debug)SLAM研究方向-Debug总结
  • (四十一)大数据实战——spark的yarn模式生产环境部署
  • (转)Groupon前传:从10个月的失败作品修改,1个月找到成功
  • (转)人的集合论——移山之道
  • (转)微软牛津计划介绍——屌爆了的自然数据处理解决方案(人脸/语音识别,计算机视觉与语言理解)...
  • (转载)微软数据挖掘算法:Microsoft 时序算法(5)
  • ***linux下安装xampp,XAMPP目录结构(阿里云安装xampp)
  • .NET 6 在已知拓扑路径的情况下使用 Dijkstra,A*算法搜索最短路径
  • .NET BackgroundWorker
  • .net core使用ef 6