【从零开始学习--设计模式--装饰者模式】

返回首页

前言

感谢各位同学的关注与支持,我会一直更新此专题,竭尽所能整理出更为详细的内容分享给大家,但碍于时间及精力有限,代码分享较少,后续会把所有代码示例整理到github,敬请期待。

此章节介绍装饰者模式。


1、代理模式

装饰器模式,允许向一个现有的对象添加新的功能,同时又不改变其结构。

这种模式创建了一个装饰类,用来包装原有的类,并在保持类方法签名完整性的前提下,提供了额外的功能。

动态地给一个对象添加一些额外的职责。就增加功能来说,装饰器模式相比生成子类更为灵活。

1.1、UML图

在这里插入图片描述
在这里插入图片描述

1.2、示例代码

// 版本一(搭配嘻哈服和白领装):增加其他装扮需要更改person类,违反了封闭开发原则
//V1.Person person = new V1.Person("shanyang");
//Console.WriteLine("第一种装扮:");
//person.WearTShirts();
//person.WearBigTrouser();
//person.WearSneakers();
//person.Show();
//Console.WriteLine("第二种装扮:");
//person.WearSuit();
//person.WearTie();
//person.WearShoes();
//person.Show();
//Console.ReadKey();// 版本二(增加超人的装扮):现在是单独输出show,应该是在内部组装完毕后显示。
// 添加超人装扮需要的子类就可以了
//V2.Person person = new V2.Person("shanyang");
//Console.WriteLine("第一种装扮:");
//V2.TShirts shirts = new V2.TShirts();
//V2.BigTrouser bigTrouser = new V2.BigTrouser();
//V2.Sneakers sneakers = new V2.Sneakers();
//shirts.Show();
//bigTrouser.Show();
//sneakers.Show();
//person.Show();
//Console.WriteLine("第二种装扮:");
//V2.Suit suit = new V2.Suit();
//V2.Tie tie = new V2.Tie();
//V2.Shoes shoes = new V2.Shoes();
//suit.Show();
//tie.Show();
//shoes.Show();
//person.Show();
//Console.ReadKey();// 版本三:装饰模式,是用SetCompenent来对对象进行包装。
V3_Decorator.Person person = new V3_Decorator.Person("shanyang");
Console.WriteLine("第一种装扮:");
V3_Decorator.TShirts shirts = new V3_Decorator.TShirts();
V3_Decorator.BigTrouser bigTrouser = new V3_Decorator.BigTrouser();
V3_Decorator.Sneakers sneakers = new V3_Decorator.Sneakers();
shirts.SetComponet(person);
bigTrouser.SetComponet(shirts);
sneakers.SetComponet(bigTrouser);
sneakers.Show();
Console.WriteLine("第二种装扮:");
V3_Decorator.Suit suit = new V3_Decorator.Suit();
V3_Decorator.Tie tie = new V3_Decorator.Tie();
V3_Decorator.Shoes shoes = new V3_Decorator.Shoes();
suit.SetComponet(person);
tie.SetComponet(suit);
shoes.SetComponet(tie);
shoes.Show();
Console.ReadKey();

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/225687.shtml

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

相关文章

【vim 学习系列文章 13.1 -- 自动命令autocmd 根据文件类型设置vim参数】

文章目录 autocmd 根据文件类型配置vim参数vim 文本类型 autocmd 根据文件类型配置vim参数 在 Vim 中,你可以使用 autocmd (自动命令)来根据文件类型自动执行特定的函数。首先,你需要定义这些函数,然后使用 autocmd 与…

java实现局域网内视频投屏播放(二)爬虫

代码链接 视频播放原理 大多视频网站使用的是m3u8,m3u8其实不是一个真正的视频文件,而是一个视频播放列表(playlist)。它是一种文本文件,里面记录了一系列的视频片段(segment)的网络地址。这些…

原来定时发朋友圈设置这么简单?看完我也会了

目前微信作为最大的社交平台之一,吸引了众多使用者。你是否听过有些朋友感叹这么多微信号,需要每天手动发布朋友圈,任务很繁琐呢?是否希望可以事先设置好定时发送的功能,让朋友圈自动更新,省去手动发送的麻…

初探栈溢出(下)

0x04 漏洞利用 作为脚本小子,先跑一下写好了的exploit脚本。 打开HackSysEVDExploit.sln文件,直接在vs2019上编译即可。 将生成的HackSysEVDExploit.exe拷贝至win7,执行如下命令 直接可以获取system权限。 那么只跑一下脚本肯定不行&#…

世微 锂电池保护IC DW01 充电器检测过充保护SOT23-6

一、 描述 DW01A 是一个锂电池保护电路,为避免锂电池因过充电、过放电、电流过大导致电池寿命缩短或电池被损坏而设计的。它具有高精确度的电压检测与时间延迟电路。 二、 主要特点 工作电流低 过充检测 4.3V,过充释放 4.05V; 过放检测 2.4…

C 库函数 - ctime()

描述 C 库函数 char *ctime(const time_t *timer) 返回一个表示当地时间的字符串,当地时间是基于参数 timer。 返回的字符串格式如下: Www Mmm dd hh:mm:ss yyyy 其中,Www 表示星期几,Mmm 是以字母表示的月份,dd 表示…

黑马头条--day01.环境搭建

一.前言 该项目学习自黑马程序员,由我整理如下,版权归黑马程序员所有 二.环境搭建 1.数据库 第一天,先创建如下库和表: sql文件如下: CREATE DATABASE IF NOT EXISTS leadnews_user DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_…

MySQL 的索引分类

文章目录 MySQL 的索引分类是什么?单列索引组合索引:全文索引:空间索引: MySQL 的索引分类是什么? 单列索引 普通索引:MySQL 中基本索引类型,没有什么限制,允许在定义索引的列中插…

LeetCode(62)删除排序链表中的重复元素 II【链表】【中等】

目录 1.题目2.答案3.提交结果截图 链接: 删除排序链表中的重复元素 II 1.题目 给定一个已排序的链表的头 head , 删除原始链表中所有重复数字的节点,只留下不同的数字 。返回 已排序的链表 。 示例 1: 输入:head [1…

【JavaEE】锁的策略

作者主页:paper jie_博客 本文作者:大家好,我是paper jie,感谢你阅读本文,欢迎一建三连哦。 本文于《JavaEE》专栏,本专栏是针对于大学生,编程小白精心打造的。笔者用重金(时间和精力)打造&…

20.Java程序设计-基于SSM框架的安卓掌上校园生活系统的设计与实现

摘要: 随着移动互联网技术的快速发展,校园生活信息化成为提高学校管理效率、方便学生生活的关键。本研究以基于SSM(Spring Spring MVC MyBatis)框架的技术体系为基础,致力于设计与实现一款功能强大、高效稳定的安卓…

现代雷达车载应用——第2章 汽车雷达系统原理 2.6节 雷达设计考虑

经典著作,值得一读,英文原版下载链接【免费】ModernRadarforAutomotiveApplications资源-CSDN文库。 2.6 雷达设计考虑 上述部分给出了汽车雷达基本原理的简要概述。在雷达系统的设计中,有几个方面是必不可少的,它们决定了雷达系…

LeetCode215. Kth Largest Element in an Array

文章目录 一、题目二、题解 一、题目 Given an integer array nums and an integer k, return the kth largest element in the array. Note that it is the kth largest element in the sorted order, not the kth distinct element. Can you solve it without sorting? …

VUE学习三、前端项目部署

1.前端项目打包 执行命令 npm run build:prod正常命令结束 , 会在前端项目里面出现dist文件夹 2.nginx下载安装 nginx下载 : http://nginx.org/en/download.html Windows 下载版本 Mainline version:Mainline 是 Nginx 目前主力在做的版本,可以说…

《使用ThinkPHP6开发项目》 - ThinkPHP6使用使用中间件验证登录Token

https://blog.csdn.net/centaury32/article/details/134997438 按照https://blog.csdn.net/centaury32/article/details/134999029的方法验证登录Token,那么每一步都需要写同样一段代码,这里可以结合中间件进行验证 一、创建中间件:php thi…

QT----第三天,Visio stdio自定义封装控件,鼠标事件,定时器,事件分发器过滤器,绘图事件

目录 第三天1 自定义控件封装2 QT鼠标事件3 定时器4 event事件分发器5 事件过滤器6 绘图事件Qpainter 源码:CPP学习代码 第三天 1 自定义控件封装 新建一个QT widgetclass,同时生成ui,h,cpp文件 在smallWidget.ui里添加上你想要的控件并调试大小 回到…

ISSUE的基本概念

ISSUE:将符合一定条件的指令从发射队列(IssueQueue)中选出来,并送到FU中执行的过程; ISSUE QUEUE也称之为reservation station, 其按照一定的规则,选择那些源操作数都已经准备好的指令,将其送到FU中执行,这个过程称为…

11.jvm第三方工具使用实践

目录 概述GCEasy官网jvm内存占用情况关键性能指标堆内存与元空间优化 MAT安装MAT相关概念说明内存泄漏与内存溢出shallow heap及retained heapoutgoing references与incoming referencesDominator Tree GCViewerArthas下载安装与启动jdk8jdk 11jdk11自定义boot jarjdk17 常用命…

LVS负载均衡集群和NAT模式部署

目录 一、群集的类型及含义 二、LVS的三种工作模式 一、根据群集所针对的目标差异,可分为三种类型 二、LVS的负载调度算法 三、ipvsadm 工具选项 四、NAT模式 LVS负载均衡群集部署 1.共享服务器配置: 2.节点服务器1配置 3.节点服务器2 4.配置负…

spring 笔记八 SpringMVC异常处理和SpringMVC拦截器

文章目录 SpringMVC拦截器拦截器(interceptor)的作用拦截器和过滤器区别拦截器是快速入门拦截器方法说明 SpringMVC拦截器拦截器(interceptor)的作用拦截器和过滤器区别拦截器是快速入门拦截器方法说明 SpringMVC异常处理异常处理…