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

文章目录

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

概述

装饰模式(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.mzph.cn/pingmian/15866.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

高精度定位平板主要应用在哪些领域

高精度定位平板是一种集成了高精度定位技术和强大计算能力的设备,能够提供亚米级甚至厘米级的定位精度。其应用领域广泛,涵盖测绘、精准农业、工程建设、地理信息系统(GIS)、公共安全等多个方面。这种设备凭借其高精度和耐用性&am…

设置MySQL like查询时不区分大小写

背景介绍 MySQL like查看结果出现了区分大小写的情况,实际需求是查询的时候不去区分大小写! 原因 MySQL的LIKE查询默认情况下是不区分大小写的。如果LIKE查询是区分大小写的,是因为列使用了区分大小写的字符集或校对规则。 解决办法 在l…

2024年上半年系统架构设计师真题(部分考场回忆版)

一、综合知识 1.常见的ADL语言,四个中选三个 2.EAI的四个层次从低到高依次是 3.反规范化设计属于数据设计的那个阶段 A.需求分析 B.概念设计 C.逻辑设计 D.物理设计 4.嵌入式往往具有实时特征,其典型架构 5.交换机位于OSI七层模型的那一层 6.常见…

肮脏至极的处事技巧,看懂少走十年弯路

处世技巧,也是肮脏至极的处事技巧,看懂少走十年弯路。有用的!!! 1、手机响5秒再接。 2、永远提前15分钟。 3、坐领导的车,不要玩手机,只坐在副驾驶,不坐后排。 4、朋友给你介绍了…

深入探讨 Java 8 集合操作:全面解析 Stream API 的强大功能

深入探讨 Java 8 集合操作:全面解析 Stream API 的强大功能 Java 8 引入的 Stream API 使得集合操作更加简洁和高效。本文通过详细示例,展示如何利用 Stream API 进行各种集合操作,包括遍历、转换、过滤、排序、分组、去重等。 1. 遍历集合…

Spring MVC+mybatis项目入门:旅游网(四)用户注册——mybatis的配置与使用以及Spring MVC重定向

个人博客:Spring MVCmybatis项目入门:旅游网(四)用户注册2-持久化 | iwtss blog 先看这个! 这是18年的文章,回收站里恢复的,现阶段看基本是没有参考意义的,技术老旧脱离时代(2024年…

使用STM32F103标准库实现自定义键盘

使用STM32F103标准库实现自定义键盘 在嵌入式系统中,自定义键盘的实现是一个经典的项目,能够帮助我们深入理解GPIO配置、按键扫描和中断处理等知识。本文将详细介绍如何使用STM32F103标准库来实现一个简单的自定义键盘。 1. 准备工作 1.1 硬件准备 S…

springboot相关知识集锦----1

一、springboot是什么? springboot是一个用于构建基于spring框架的独立应用程序的框架。它采用自动配置的原则,以减少开发人员在搭建应用方面的时间和精力。同时提升系统的可维护性和可扩展性。 二、springboot的优点 约定优于配置 版本锁定&#xf…

嵌入式0基础开始学习 ⅠC语言(9)小结补充

这一章呢,来讲一些之前没讲到过的一些点 1.作用域 什么是作用域? 一个东西(对象)起作用的范围。 变量的作用域 函数的作用域 类型的作用域 一个c语言工…

C#【进阶】特殊语法

特殊语法、值和引用类型 特殊语法 文章目录 特殊语法1、var隐式类型2、设置对象初始值3、设置集合初始值4、匿名类型5、可空类型6、空合并操作符7、内插字符串8、单句逻辑简略写法 值和引用类型1、判断值和引用类型2、语句块3、变量的生命周期4、结构体中的值和引用5、类中的值…

Hive 常用指标分析

常用指标分析 用户留存率路径分析7日品牌复购率7天内连续三天登录每分钟在线人数 1. 用户留存率 在使用 Hive 统计用户留存率时,我们通常会涉及到两个主要日期:用户注册日期和用户在后续某天的活跃日期。留存率通常是指用户在注册后的某一天仍然活跃的…

重学java 45.多线程 下 总结 定时器_Timer

人开始反向思考 —— 24.5.26 定时器_Timer 1.概述:定时器 2.构造: Timer() 3.方法: void schedule(TimerTask task, Date firstTime, long period) task:抽象类,是Runnable的实现类 firstTime:从什么时间开始执行 period:每隔多长时间执行一次…

内蒙古包头师范学院体育学院车志宏教授

女,汉族,体育学院院长,承担学校体育学、篮球等课程教学工作,曾住持自治区3项科研项目,发表论文5篇,获奖2篇。 1992年天津体育学院体育教育专业,获学士学位; 1998年天津外国语大学体…

fpga问题整理

1、quartus联合modelsim仿真 无波形 问题: modelsim仿真无波形,打开transcript可以看到警告。 警告: # ** Warning: (vlog-2083) f:/program files/altera/ 13.1/quartus/ eda/sim_lib/ altera_lnsim.sv(22728): Carriage return (0x0D) is…

MySQL之Schema与数据类型优化(五)

Schema与数据类型优化 特殊类型数据 某些类型的数据并不直接与内置类型一致。低于秒级精度的时间戳就是一个例子。另外一个例子是一个IPv4地址。人们经常使用VARCHAR(15)列存储IP地址。然而,它们实际上是32位无符号整数。不是字符串。用小数点将地址分成四段的表示…

用AI比赛助手降维打击数学建模,比赛过程详细介绍,这保研不就稳了吗

数学建模是个小众的赛道,可能很多大学生不知道,简单来说:他能薅学分、保研加分、毕业好找工作(简历上写一辈子),尤其是基于GPT-4o模型,简直对他们是降维打击。 数学建模每年的比赛非常多,像国赛、美赛、深…

asrpro softspi SD卡读写

采样 50M 1M;采样时间足够长,采样频率1M 避免信息遗漏 引脚 cs pa2 mosi pa3 sck pa5 miso pa6 vcc ->5v gnd ->gnd ARDUINO SD库与移植(原本是打算移值tw ch32v103的sd库的,但没有对比,只能选择arduino ; …

Keras深度学习框架第二十六讲:使用KerasNLP上传模型

1、上传模型的概念 在机器学习和深度学习领域,"上传模型"通常指的是将训练好的模型保存到某个位置,以便后续使用或分享,而不是直接通过KerasNLP库进行上传操作。但在这里,我们可以理解为保存和分享模型。 当程序员使用…

Java进阶学习笔记22——泛型方法、通配符和上下限

泛型方法: package cn.ensource.d11_generics_method;public class Test {public static void main(String[] args) {// 泛型方法String res test("Java");System.out.println(res);Dog dog1 test(new Dog());System.out.println(dog1);}// 泛型方法pub…

手机上制作证件照

最近由于需要给老姐弄一组证件照,找了一通手机上的软件,找到一款性价比较高的,详细流程记录下来。vx小程序上搜索"泰世茂证件照",打开首页如下图所示∶ 单击"开始制作" ,选择一个证件照类别&#…