.NET高级面试指南专题十六【 装饰器模式介绍,包装对象来包裹原始对象】

在这里插入图片描述

装饰器模式(Decorator
Pattern)是一种结构型设计模式,用于动态地给对象添加额外的职责,而不改变其原始类的结构。它允许向对象添加行为,而无需生成子类。

实现原理:

装饰器模式通过创建一个包装对象来包裹原始对象,并在包装对象上添加额外的功能。这种模式允许将一个或多个装饰器叠加在原始对象上,从而实现功能的组合。

思路:

  • 定义一个抽象组件接口,该接口声明了原始对象和装饰器的公共方法。
  • 创建具体组件类,实现抽象组件接口,表示原始对象。
  • 创建抽象装饰器类,实现抽象组件接口,包含一个对抽象组件的引用,并在其基础上添加额外的功能。
  • 创建具体装饰器类,继承自抽象装饰器类,实现具体的装饰功能。
  • 在客户端代码中,通过组合装饰器对象来动态地添加功能。

优点:

  1. 对扩展开放、对修改封闭:通过装饰器模式,可以在不修改原始类的情况下动态地添加新功能,使得代码更加灵活、可扩展。
  2. 遵循单一职责原则:每个装饰器只关注于单一功能的添加,使得代码更易于理解和维护。

C#代码示例:

using System;// 抽象组件接口
interface IComponent
{void Operation();
}// 具体组件类
class ConcreteComponent : IComponent
{public void Operation(){Console.WriteLine("ConcreteComponent Operation");}
}// 抽象装饰器类
abstract class Decorator : IComponent
{protected IComponent _component;public Decorator(IComponent component){this._component = component;}public virtual void Operation(){if (_component != null){_component.Operation();}}
}// 具体装饰器类
class ConcreteDecoratorA : Decorator
{public ConcreteDecoratorA(IComponent component) : base(component){}public override void Operation(){base.Operation();Console.WriteLine("ConcreteDecoratorA Operation");}
}class ConcreteDecoratorB : Decorator
{public ConcreteDecoratorB(IComponent component) : base(component){}public override void Operation(){base.Operation();Console.WriteLine("ConcreteDecoratorB Operation");}
}class Program
{static void Main(string[] args){// 创建具体组件对象IComponent component = new ConcreteComponent();// 使用装饰器A装饰具体组件Decorator decoratorA = new ConcreteDecoratorA(component);decoratorA.Operation();Console.WriteLine("-----------");// 使用装饰器B装饰具体组件Decorator decoratorB = new ConcreteDecoratorB(component);decoratorB.Operation();Console.WriteLine("-----------");// 使用装饰器A和B叠加装饰具体组件Decorator decoratorAB = new ConcreteDecoratorB(new ConcreteDecoratorA(component));decoratorAB.Operation();}
}

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

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

相关文章

Mysql命令行客户端

命令行客户端 操作数据库操作数据表 操作数据库 mysql> create database mike charsetutf8; Query OK, 1 row affected (0.01 sec) mysql> show databases; -------------------- | Database | -------------------- | information_schema | | mike …

ARM基础----STM32处理器操作模式

STM32处理器操作模式 Cortex-M处理器操作模式、特权等级和栈指针操作模式栈指针CONTROL寄存器异常压栈时的SP指针 Cortex-A 处理器运行模型寄存器组 Cortex-M处理器操作模式、特权等级和栈指针 操作模式 处理模式:执行中断服务程序等异常处理,处理器具有…

STM32FreeRTOS信号量(STM32cube高效开发)

一、信号量 (一)信号量概括 信号量是操作系统中重要的一部分,信号量是一种解决同步问题的机制,可以实现对共享资源的有序访问。 FreeRTOS 提供了多种信号量,按信号量的功能可分为二值信号量、计数型信号量、互斥信…

WPF Interaction

使用 Interaction 里面的方法来将事件映射到ViewModel层 引用命名空间:System.Windows.Interactivity.dll 在xaml界面引用这两种任意一个就行,这两个做的事情是相同的。 xmlns:i"clr-namespace:System.Windows.Interactivity;assemblySystem.Win…

宽度优先搜索算法(BFS)

宽度优先搜索算法(BFS)是什么? 宽度优先搜索算法(BFS)(也称为广度优先搜索)主要运用于树、图和矩阵(这三种可以都归类在图中),用于在图中从起始顶点开始逐层…

uVeiw color 颜色值

此功能为uView内部通过js提供的一些颜色值,可以用于通过js修改元素字体,背景颜色等一些场景,常用于uView的各个组件中。 这些颜色值,挂载在$u对象下的color数组中,关于这些颜色值的具体描述,详见Color 色彩…

指针--2

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言1.指针运算1.1.指针-整数1.2.指针-指针1.3.指针的关系运算 2.野指针2.1 野指针成因2.2 如何规避野指针 3.assert 断言4.指针的使用和传址调用4.1 strlen的模拟实…

模型训练中数据标注是什么意思?

问题: 模型训练中数据标注是什么意思? 解答 在机器学习和深度学习领域中,数据标注是指对原始的、未经处理的数据(如图像、文本、音频、视频或3D点云)进行人工标记的过程。这个过程为每一份数据赋予一个明确的标签或…

nn.Conv2d()中的groups分组参数

1.参考文章: 【Pytorch】搞懂nn.Conv2d的groups参数的作用 - 知乎 (zhihu.com) 2.理解: (1)只要你 明白了 多通道的卷积是如何实现的(可以看我的1X1卷积文章),那么这里的分组进行卷积就非常好…

bat 调用bat 等待执行完成

在Windows批处理(.bat)文件中,如果你需要调用另一个批处理文件并等待它执行完成后再继续执行后续命令,可以使用 call 命令来实现。call 命令会启动新的批处理文件,并在子脚本执行完毕后返回到父脚本来执行余下的命令。…

【Tauri】(4):整合Tauri和actix-web做本地大模型应用开发,可以实现session 登陆接口,完成页面展示,进入聊天界面

1,视频地址 https://www.bilibili.com/video/BV1GJ4m1Y7Aj/ 【Tauri】(4):整合Tauri和actix-web做本地大模型应用开发,可以实现session 登陆接口,完成页面展示,进入聊天界面 使用国内代理进行加…

软考笔记--软件可靠性评价

一.软件可靠性评价概述 软件可靠性评价是软件可靠性活动的重要组成部分,即适用于软件开发过程,也可以针对最终软件系统。在软件开发过程中使用软件可靠性评价,可以使用软件可靠性模型,估计软件当前的可靠性,以确认是否…

6-DOF GraspNet: Variational Grasp Generation for Object Manipulation

总结: 使用变分自动编码器(VAE)对抓取进行采样,并使用基于点网的抓取评估器模型对采样的抓取进行评估和细化 摘要: 我们将抓取生成问题表述为 使用变分自编码器对一组抓取进行采样,并使用抓取评 估器模型对采样的抓取进行评估和…

备考2024年小学生古诗文大会:历年真题15题练习和独家解析

如何提高小学生古诗词的知识?如何激发小学生古诗词的学习兴趣?如何提高小学古诗词的学习成绩?如何备考2024年小学生古诗文大会?...如果你也在关心和这些问题,我的建议是参加每年一度的小学生古诗词大会(免费…

亚马逊跨境电商名词解释

亚马逊界面名词解释 最常用的名词解释总结: ASIN:亚马逊标准标识号,也就是每个商品的编码标识,每个商品的都不同,可以把它当成该商品的“身份证号”。由亚马逊随机生成的字母数字组合。 SKU:库存进出计量单位。 Listing&#xf…

太强了!最全的大模型检索增强生成(RAG)技术概览!

本文是对检索增强生成(Retrieval Augmented Generation, RAG)技术和算法的全面研究,对各种方法进行了系统性的梳理。文章中还包含了我知识库中提到的各种实现和研究的链接集合。 鉴于本文的目标是对现有的RAG算法和技术进行概览和解释&#…

django学习记录07——订单案例(复选框+ajax请求)

1.订单的数据表 1.1 数据表结构 1.2 数据表的创建 models.py class Order(models.Model):"""订单号"""oid models.CharField(max_length64, verbose_name"订单号")title models.CharField(max_length64, verbose_name"名称&…

做跨境电商,选哪个浏览器好?跨境电商浏览器推荐

在我们的日常生活中,有很多浏览器可供选择,比如百度浏览器、谷歌浏览器和360、火狐等等。但是在跨境电商行业中,是否有特别适合我们卖家使用的浏览器呢?所谓跨境电商浏览器,就是为跨境电商用户设计的浏览器&#xff0c…

Unity 采用自定义通道ShaderGraph实现FullScreen的窗户雨滴效果

效果如下 ShaderGraph实现 N21 随机化 DragLayer分层 将DragLayer分成四层,分别调整每层的缩放和大小 Shader实现的链接(Unity 雨水滴到屏幕效果) 我也是参考这个实现Shader Graph

【PythonCode】力扣Leetcode1~5题Python版

【PythonCode】力扣Leetcode1~5题Python版 前言 力扣Leetcode是一个集学习、刷题、竞赛等功能于一体的编程学习平台,很多计算机相关专业的学生、编程自学者、IT从业者在上面学习和刷题。 在Leetcode上刷题,可以选择各种主流的编程语言,如C、…