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

news2025/2/26 1:48:33

在这里插入图片描述

装饰器模式(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.coloradmin.cn/o/1504906.html

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

相关文章

【数据可视化】动手用matplotlib绘制关联规则网络图

下载文中数据、代码、绘图结果 文章目录 关于数据绘图函数完整可运行的代码运行结果 关于数据 如果想知道本文的关联规则数据是怎么来的,请阅读这篇文章 绘图函数 Python中似乎没有很方便的绘制网络图的函数。 下面是本人自行实现的绘图函数,如果想…

【深度学习笔记】6_9 深度循环神经网络deep-rnn

注:本文为《动手学深度学习》开源内容,部分标注了个人理解,仅为个人学习记录,无抄袭搬运意图 6.9 深度循环神经网络 本章到目前为止介绍的循环神经网络只有一个单向的隐藏层,在深度学习应用里,我们通常会用…

three.js如何实现简易3D机房?(四)点击事件+呼吸灯效果

接上一篇: three.js如何实现简易3D机房?(三)显示信息弹框/标签:http://t.csdnimg.cn/5W2wA 目录 八、点击事件 1.实现效果 2.获取相交点 3.呼吸灯效果 4.添加点击事件 5.问题解决 八、点击事件 1.实现效果 2.…

ChatGPT发不出消息?GPT发不出消息怎么办?

前言 今天发现,很多人的ChatGPT无法发送信息,我就登陆看一下自己的GPT的情况,结果还真的无法发送消息,ChatGPT 无法发送消息,但是能查看历史的对话,不过通过下面的方法解决了。 第一时间先打开官方的网站&a…

Mint_21.3 drawing-area和goocanvas的FB笔记(七)

FreeBASIC gfx 基本 graphics 绘图 8、ScreenControl与屏幕窗口位置设置 FreeBASIC通过自建屏幕窗口摆脱了原来的屏幕模式限制,既然是窗口,在屏幕坐标中就有它的位置。ScreenControl GET_WINDOW_POS x, y 获取窗口左上角的x, y位置;ScreenC…

【REST2SQL】11 基于jwt-go生成token与验证

【REST2SQL】01RDB关系型数据库REST初设计 【REST2SQL】02 GO连接Oracle数据库 【REST2SQL】03 GO读取JSON文件 【REST2SQL】04 REST2SQL第一版Oracle版实现 【REST2SQL】05 GO 操作 达梦 数据库 【REST2SQL】06 GO 跨包接口重构代码 【REST2SQL】07 GO 操作 Mysql 数据库 【RE…

设计模式学习系列 -- 随记

文章目录 前言 一、设计模式是什么? 二、设计模式的历史 三、为什么以及如何学习设计模式? 四、关于模式的争议 一种针对不完善编程语言的蹩脚解决方案 低效的解决方案 不当使用 五、设计模式分类 总结 前言 最近可能工作生活上的稳定慢慢感觉自己丢失…

掌握 Vue3、Vite 和 SCSS 实现一键换肤的魔法步骤

前言 一个网站的换肤效果算是一个比较常见的功能,尤其是在后台管理系统中,我们几乎都能看到他的身影,这里给大家提供一个实现思路。 搭建项目 vitevue3搭建项目这里就不演示了,vite官网里面讲得很清楚。 注:这里使…

浅析开源内存数据库Fastdb

介绍: Fastdb是免费开源内存数据库,其优秀的性能,和简洁的C代码,让我学习使用过程中收益颇多,但是国内中文相关研究的文章相当稀少,外文我查询相当不便。有兴趣的朋友可以通过以下网站访问:Mai…

java-ssm-jsp基于ssm的冰淇淋在线购买网站

java-ssm-jsp基于ssm的冰淇淋在线购买网站 获取源码——》公主号:计算机专业毕设大全

【STM32】HAL库 CubeMX 教程 --- 通用定时器 TIM2 定时

实验目标: 通过CUbeMXHAL,配置TIM2,1s中断一次,闪烁LED。 一、常用型号的TIM时钟频率 1. STM32F103系列: 所有 TIM 的时钟频率都是72MHz;F103C8不带基本定时器,F103RC及以上才带基本定时器。…

react实战——react旅游网

慕课网react实战 搭建项目问题1.按照官网在index.tsx中引入antd出错?2.typescript中如何使用react-router3.react-router3.1 V63.2 V53.3V6实现私有路由 4.函数式组件接收props参数时定义数据接口?5.使用TypeScript开发react项目:6.要使一个组…

探索stable diffusion的奇妙世界--01

目录 1. 理解prompt提示词: 2. Prompt中的技术参数: 3. Prompt中的Negative提示词: 4. Prompt中的特殊元素: 5. Prompt在stable diffusion中的应用: 6. 作品展示: 在AI艺术领域,stable di…

数据结构——线性表顺序表示详解

目录 1.线性表的类型定义 2.基本操作 3.线性表的存储结构 4.补充 1.元素类型说明 2.数组定义​编辑 3.c语言的内存动态分配 4.c的动态存储分配 5.c中的参数传递 引用类型作参数 6.顺序表基本操作的实现 1.线性表的初始化 代码示例: 2.销毁线性表&…

远程连接Linux系统

图形化、命令行 对于操作系统的使用,有2种使用形式: 图形化页面使用操作系统 图形化:使用操作系统提供的图形化页面,以获得图形化反馈的形式去使用操作系统。 以命令的形式使用操作系统 命令行:使用操作系统提供的各…

腾讯云轻量服务器Windows系统使用IIS实现公网直链访问文件

windows方便所以服务器装的windows系统,windows默认不能分享文件直链,只要用IIS建个站点就行了 先弄一台有公网ip的windows系统服务器打开服务器管理器,添加这个 打开IIS右键添加网站 程序池默认,路径选个文件夹作为网站根目录 …

tomcat通过service.bat install方式安装,内存不够了怎么办?

1.通过service.bat安装 安装命令再tomcat的bin目录下,执行命令 .\service.bat install Apache Tomcat 8.5 Tomcat8之后就会在服务里面有个tomcat服务 2. 如何增加tomcat内存呢? 通过service.bat安装肯定再service.bat中配置啊。 再service.bat文件中…

RHCE——一、OpenEuler22.03安装部署及例行性任务

RHCE 一、OpenEuler22.03安装部署及例行性任务 一、网络服务1.准备工作2、RHEL9操作系统的安装部署3、配置并优化OpenEuler22.034、网络配置实验:修改网络配置 二、例行性工作1、 单一执行的例行性任务:at(一次性)at命令详解 2、循…

MQTT连接阿里云物联网上报物模型数据

目录 1. 创建产品(物联网平台 -> 产品 -> 创建产品) 2. 为产品添加设备 3. 添加物模型 4. mqtt.fx连接测试 5. 调试物模型 6. 使用mqtt.fx上报温度数据 1. 创建产品(物联网平台 -> 产品 -> 创建产品) 我这里再新…

企业内部培训考试系统首页自定义版块说明

企业内部培训考试系统首页自定义版块说明,企业内部培训考试系统手机端首页设计太灵活。 1、整站主题色自定义,更换主题色后,重要的文字和按钮颜色都自动使用主题色渲染,相当于一键换皮肤。 2、首页背景图自定义,想换…