当前位置: 首页 > 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,翻篇。感兴趣,可以来学习学习。

http://www.lryc.cn/news/356829.html

相关文章:

  • Java - 当年很流行,现在已经淘汰的 Java 技术,请不要在继续学了!!!
  • 驻波比VSWR
  • 多线程-线程池
  • 护网期间遇到的几个上传bypass waf、edr
  • 简述MVC模式
  • C#--Mapster(高性能映射)用法
  • mysql实战——Mysql8.0高可用之双主+keepalived
  • 关于同一个地址用作两个不同页面时,列表操作栏按钮混淆状态
  • Oracle段延迟分配(Deferred Segment Creation)解析
  • Linux:IPC - System V
  • Laravel 图片添加水印
  • 嵌入式进阶——矩阵键盘
  • 请说出vue.cli项目中src目录每个文件夹和文件的用法
  • 【MySQL精通之路】InnoDB磁盘I/O和文件空间管理(11)
  • 基于springboot+html的二手交易平台(附源码)
  • 正点原子[第二期]Linux之ARM(MX6U)裸机篇学习笔记-24.3,4 SPI驱动实验-I.MX6U SPI 寄存器
  • 【Pandas】数据处理方法
  • 【ArcGIS For JS】前端geojson渲染行政区划图层并加标签
  • Spring AOP原理详解:动态代理与实际应用
  • 死锁的四个必要条件
  • 源网络地址转换SNAT
  • 【算法】平衡二叉搜索树的左旋和右旋
  • 介绍Django Ninja框架
  • 使用uniapp内置组件checkbox-group所遇到的问题
  • 嵌入式学习记录5.23(超时检测、抓包分析)
  • Linux|如何在 awk 中使用流控制语句
  • OceanBase数据库诊断调优,与高可用架构——【DBA从入门到实践】第八期
  • LLVM技术在GaussDB等数据库中的应用
  • 【SQL学习进阶】从入门到高级应用(三)
  • 迷你手持小风扇哪个品牌续航强?五款强续航迷你手持小风扇推荐!