C#设计模式--装饰器模式

C#设计模式教程(10):装饰器模式 装饰器模式(Decorator Pattern)是一种结构型设计模式,它允许用户在不修改现有对象结构的情况下,动态地给一个对象添加额外的职责。这种模式创建了一个装饰类,用来包装原有的类。这种模式创建了一个装饰类,用于包装原有的类,并在保持类方法签名完整性的前提下,提供了额外的功能。组件接口(Component):定义一个对象接口,可以给这些对象动态地添加职责。具体组件(ConcreteComponent):定义了一个对象,可以给这个对象添加一些额外的职责。装饰抽象类(Decorator) 阅读详情

0.C#设计模式--简单工厂模式

1.C#设计模式--工厂方法模式

2.C#设计模式--抽象工厂模式

3.C#设计模式--单例模式

4.C#设计模式--建造者模式

5.C#设计模式--原型模式

6.C#设计模式--适配器模式

设计模式:

装饰器模式(Decorator Pattern)

简单介绍:

装饰器模式(Decorator Pattern):

假设有一部手机你购买来以后只有手机,然后你需要再给其添加一些装饰,比如保护壳,钢化膜或者手机贴画等,这个就是装饰者模式的思想

装饰器模式主要组成部分:

Component:定义一个对象接口,可以给这些对象动态地添加职责

ConcreteComponent:定义一个对象,可以给这个对象添加一些职责

Decorator:维持一个指向Component的指针,并定义一个与Component接口一致的接口

ConcreteDecorator:负责向ConcreteComponent添加功能

在装饰模式中,Decorator定义了一个装饰接口类。因为Decorator与ConcreteComponent继承同一个接口,所以继承Decorator的类ConcreteDecorator可以使用ConcreteComponent的方法,再在ConcreteDecorator里面加入一些新的方法,也就是装饰,就成为了一个包装好的装饰类。

适配器模式类图:

装饰者模式C#代码举例:

Component 对象类

    /// <summary>
    /// 对象类
    /// </summary>
    public abstract class Component
    {
        public abstract void Print();
    }

ConcreteComponenet 类 对象的修饰实现类

    public class ConcreteComponent:Component
    {
        /// <summary>
        /// 对象修饰类
        /// </summary>

        public override void Print()
        {
            Console.WriteLine("我是ConcreteComponent!");
        }
    }

Decorator类 装饰器类

    /// <summary>
    /// 装饰器类
    /// </summary>
    public class Decorator:Component
    {
        protected Component _component;

        public void SetComponent(Component component)
        {
            this._component = component;
        }
        public override void Print()
        {
            if (_component != null)
            {
                _component.Print();
            }
        }
    }

ConcreteDecoratorA类 装饰子类A

    /// <summary>
    /// 装饰子类A
    /// </summary>
    public class ConcreteDecoratorA: Decorator
    {
        public override void Print()
        {
            base.Print();
            Console.WriteLine("我是ConcreteDecoratorA!");
        }
    }

ConcreteDecoratorB 装饰子类B

    /// <summary>
    /// 装饰子类B
    /// </summary>
    public class ConcreteDecoratorB:Decorator
    {
        public override void Print()
        {
            base.Print();
            Console.WriteLine("我是ConcreteDecoratorB!");
        }
    }

用户测试类:

    class Client
    {
        static void Main(string[] args)
        {
            ConcreteComponent concreteComponent = new ConcreteComponent();
            ConcreteDecoratorA concreteDecoratorA = new ConcreteDecoratorA();
            ConcreteDecoratorB concreteDecoratorB = new ConcreteDecoratorB();

            concreteDecoratorA.SetComponent(concreteComponent);
            concreteDecoratorA.Print();
            Console.WriteLine("--------------------------------");
            concreteDecoratorB.SetComponent(concreteDecoratorA);

            concreteDecoratorB.Print();
            Console.Read();

        }
    }

运行结果:

源代码工程文件下载

装饰者模式实际生活举例

举例说明

假设有一部手机你购买来以后只有手机,然后你需要再给其添加一些装饰,比如保护壳,钢化膜或者手机贴画等

mobilephone 原手机接口

    /// <summary>
    /// 手机接口
    /// </summary>
    public abstract class MobilePhone
    {
        public abstract void Print();
    }

AppleMobilePhone类 手机的修饰类

    /// <summary>
    /// 手机的修饰
    /// </summary>
    public class AppleMobilePhone :MobilePhone
    {
        public override void Print()
        {
            Console.WriteLine("我是一部苹果手机!");
        }
    }

Decorator类 装饰器类

    /// <summary>
    /// 装饰器
    /// </summary>
    public class Decorator:MobilePhone
    {
        protected MobilePhone mobliePhone;
        public void SetMobilePhone(MobilePhone phone)
        {
            this.mobliePhone = phone;
        }

        public override void Print()
        {
            if (mobliePhone != null)
            {
                mobliePhone.Print();
            }
        }
    }

MobilePhoneShell类 手机壳修饰类

    /// <summary>
    /// 手机壳类
    /// </summary>
    public class MobilePhoneShell:Decorator
    {
        public override void Print()
        {
            base.Print();
            Console.WriteLine("我是一个手机保护壳!");
        }
    }

MobilePhoneStickers类 手机贴画修饰类

    /// <summary>
    /// 手机贴画修饰类
    /// </summary>
    public class MobilePhoneStickers:Decorator
    {
        public override void Print()
        {
            base.Print();
            Console.WriteLine("我是一个手机贴画!");
        }
    }

用户测试类

    class Client
    {
        static void Main(string[] args)
        {
            Console.WriteLine("----------------手机-----------------");
            AppleMobilePhone appleMobilePhone = new AppleMobilePhone();
            appleMobilePhone.Print();

            Console.WriteLine("---------加了手机壳的手机----------------");
            MobilePhoneShell mobilePhoneShell = new MobilePhoneShell();
            mobilePhoneShell.SetMobilePhone(appleMobilePhone);
            mobilePhoneShell.Print();

            Console.WriteLine("----------加了手机贴画的手机---------------");
            MobilePhoneStickers mobilePhoneStickers = new MobilePhoneStickers();
            mobilePhoneStickers.SetMobilePhone(appleMobilePhone);
            mobilePhoneStickers.Print();
            Console.WriteLine("----------既加了手机壳又加了手机贴画的手机--------");

            mobilePhoneStickers.SetMobilePhone(mobilePhoneShell);
            mobilePhoneStickers.Print();

            Console.Read();

        }
    }

运行结果

源代码工程文件下载地址

论文记录:Affine Formation Maneuver Control of Multiagent Systems 多智能体编队控制仿真记录 实现功能:平移/旋转/尺寸缩放/shear,见截图 注意:本仿真图只是起到了演示效果,中间过程速度产生突变,实际中是不允许的。需要进行速度规划,这一点论文中仿真图更为贴合实际。 参考论文:Zhao, S. (2018). Affine Formation Maneuver Control of Multiagent Systems. IEEE Transactions on Automatic Control, 63(12), 4140–4155. 突然发现有个博主写得很好,参考: 阅读详情

相关推荐

Multisim14安装失败?手把手教你彻底清理残留文件(附专用卸载工具)

本文针对Multisim14安装失败问题,提供了一套从根源解决的完整方案。文章详细分析了安装失败的三大元凶——文件残留、注册表残留和隐藏组件,并手把手指导用户使用专用卸载工具进行标准化清理,再结合手动深度清理文件系统和注册表,最终实现彻底卸载和完美重装,有效解决Multisim14安装问题。

weixin_29179311的博客 318

C# 设计模式(结构型模式):装饰器模式

装饰模式是一种结构型设计模式,主要用于在不改变对象结构的前提下,动态地为对象添加额外的职责。装饰模式通过创建一个包装类来“装饰”目标对象,并且该包装类能够增强或修改目标对象的行为。装饰模式是一个非常灵活的设计模式,适用于需要在运行时为对象动态添加功能的场景。它通过装饰器类来增强目标对象的行为,并允许我们不修改原始对象的代码就能实现功能扩展。掌握装饰模式,可以帮助我们设计出更加灵活、可扩展的系统,尤其适用于那些具有很多扩展功能的对象。

玉面小浪君的博客 1423

W5500 MACRAW模式实战:在ESP32上抓取并解析原始以太网数据包

本文详细介绍了如何在ESP32开发板上使用W5500芯片的MACRAW模式捕获和解析原始以太网数据包。通过硬件连接指南、代码实现示例和协议解析技巧,帮助开发者深入理解网络通信底层机制,实现网络嗅探和自定义协议开发等高级应用。

weixin_42520573的博客 418

C# 设计模式之装饰器模式

C# 设计模式之装饰器模式

鲤籽鲲的博客 1718

硅谷刷屏的ClawdBot,让Mac mini卖爆了!创始人爆料:一人开发、100% AI 写代码

这两天,个人 AI 助手 ClawdBot 席卷硅谷,国内外社交平台上全是关于它的讨论。 在试用后,网友们纷纷给出了很高的评价。“它是迄今为止最伟大的 AI 应用,相当于你 24 小时全天候专属 AI 员工。”Creator Buddy 创始人兼 CEO Alex Finn 盛赞道,“这就是他们 (Anthropic) 希望 Claude Cowork 呈现的样子。”

技术引领业务创新 1587

基于vivado实现FFT/IFFT

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录前言一、实现的功能二、配置1.调用DDS的IP核2.调用FFT的IP核三、结果分析1.调用DDS的IP核2.读入数据总结 前言 提示:这里可以添加本文要记录的大概内容: 例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。 提示:以下是本篇文章正文内容,下面案例可供参考 一、实现的功能 示例:pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任

qq_45600102的博客 1万+

c#装饰器模式详解

动态地给一个对象添加一些额外的职责。适用于需要扩展一个类的功能,或给一个类添加多个变化的情况。装饰器,顾名思义就是在原有基础上添加一些功能。大家都只知道如果想单纯的给原有类增加一些功能,可以直接继续该类生成一个子类就可以。举个例子,如果现在有个手机类,想给手机贴膜,传统的做法就是新建一个手机类的子类(手机贴膜子类),继承自手机类。使用这个子类就可以完成对手机的贴膜操作。那如果又想给手机按保护壳的话,传统做法有两种,可以继续新建一个手机类的子类(手机保护壳子类),继承自手机类。

kfashfasf的博客 750

Android 11系统定制:如何彻底隐藏状态栏电池图标(RK3568实测)

本文详细解析了在Android 11系统上如何通过多维度修改实现状态栏电池图标的彻底隐藏,特别针对RK3568平台提供了实战指南。从系统UI架构解析到核心配置文件修改,再到进阶技巧与疑难排查,帮助开发者深度定制Android系统,满足特定场景需求。

weixin_29250573的博客 379

C#设计模式之装饰器模式

装饰器模式 文章目录装饰器模式模式分类模式产生的原因模式的灵感来源模式类图代码实现经典代码实现:装饰器模式总结装饰器模式的优点:装饰器模式的缺点: 本片博客将介绍装饰器模式,装饰器模式是一种用于替代继承的技术,它通过一种无需定义子类的方式给对象动态的添加职责,使用对象之间的关联关系替代继承关系。装饰器模式降低了系统的耦合度,可以动态增加或者删除对象的职责,并使得需要装饰的具体构件类和用于装饰的具体装饰类可以相互独立的变化。 模式分类 结构型设计模式。 模式产生的原因 在软件开发时,有些时候我们不能使用继承对

BraveRunTo的博客 768

Creo模型装配总结

creo7.0的零件装配操作方法,建立基准面、新建约束、约束顺序

heda3的博客 1万+

【Python】解决 ERROR: Exception:Traceback (most recent call last):(亲测有效)

1、遇到问题2、问题解决

Fanjufei的博客 1万+

c#设计模式之装饰器模式(Decorator Pattern)

c#设计模式之装饰器模式(Decorator Pattern) 引子 在面向对象语言中,我们常常会听到这样一句话:组合优于继承.那么该如何去理解这句话呢? 下面我将以游戏装备为模型用简单的代码去展示它 先创建一个装备的抽象类,然后创建刀枪2个具体的业务子类 1 public abstract class AbstractEquipment 2 { 3 public int Id { get; set; } 4 5 public string

以梦为马 不负韶华 529

让 IF 更好读:在 ABAP 里尽量使用正向条件的实战指南

摘要:SAP系统开发中,代码可读性与可维护性的关键往往在于条件判断的写法。Clean ABAP风格指南建议尽量采用正向表达的条件判断,如使用has_entries = abap_true而非否定式写法。正向表达能降低理解成本,避免"否定的否定"带来的逻辑混乱,但不应为追求正向而制造空分支。在团队协作中,正向条件更利于代码评审和测试覆盖,建议通过工具检查和智能评审确保规范执行。落地时可关注变量命名正向化、避免空分支、主流程清晰展开等要点,以提升长期维护效率。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 246

C# 设计模式:第七章 - 结构型模式 之 装饰器模式(Decorator Pattern)

在这章中,我们学习了装饰器模式的基本概念、应用场景、实现方法以及注意事项。装饰器模式提供了一种动态地为对象添加新功能的方式,而不需要修改原有的类。它在避免类爆炸、支持多态性和提高代码灵活性方面有着重要的作用。我们通过两个实际的代码示例展示了如何在 C# 中实现装饰器模式,包括基本装饰器模式和咖啡店的饮品系统。最后,我们还讨论了一些使用装饰器模式时需要注意的地方,帮助你在实际开发中做出明智的选择。

caifox的博客 1236

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

C#设计模式--装饰器模式(Decorator Pattern)

装饰器模式是一种结构型设计模式,它允许在运行时动态地给一个对象添加职责,而不需要修改对象的结构。

仰望星空的人 1644

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

C#设计模式之【结构型设计模式:装饰器模式】

C#设计模式之【结构型设计模式:装饰器模式】一.装饰器模式简述二.代码示例三.总结 一.装饰器模式简述   概念: 装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构。这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装。   就增加功能而言,装饰器模式比直接生成子类更加灵活。装饰器模式使用继承+组合的方式解决问题。   下面我们以给汽车改装的例子进行代码示例,假如我新买了一部奥迪A8,我想给它进行改装发动机(必选项,先改装),改轮毂、车身喷漆、改排

qq_33101689的博客 448

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

C# 设计模式———装饰器模式

装饰器模式简介 动态地给一个对象添加一些额外的职责。就增加功能来说,它相比生成子类更为灵活。这种模式创建了一个装饰类,用来包装原有的类,并在保持类方法签名完整性的前提下,提供了额外的功能。 Component 类充当抽象角色,不应该具体实现。 修饰类引用和继承 Component 类,具体扩展类重写父类方法 一般的,我们为了扩展一个类经常使用继承方式实现,由于继承为类引入静态特征,并且随着...

chasinghope的博客 561

C#设计模式之10——装饰器模式

装饰器模式提供了一种在无需创建新的派生类的情况下修改个体对象行为的方式。 假设我们需要给工具栏中的按钮添加一个特殊的边框,如果我们创建一个新的派生出来的按钮类,那么就意味着这一新类的所有按钮都会有相同的特殊的边框,这可能并不是我们最初想要的结果。替代的做法是,我们可以创建一个装饰器类来修饰按钮,然后从这一主修饰器类中派生出任意特定的装饰器,每个装饰器完成某种特定类型的装饰。这是另一种对象包含比对

Work Hard, Play Harder! 5204

【C#设计模式】结构型设计模式 (适配器模式,装饰器模式)。

【代码】【C#设计模式】结构型设计模式 (适配器模式,装饰器模式)。

Liaiblog 417

【C#设计模式(10)——装饰器模式(Decorator Pattern)】

装饰器模式可以在运行时为对象添加额外的功,而无需修改原始对象的代码。这种方式比继承更加灵活。

weixin_43626218的博客 555

23种设计模式之《装饰器模式(Decorator)》在c#中的应用及理解

装饰器模式通过组合的方式动态地为对象添加功能,避免了继承的局限性。在C#中,装饰器模式可以用于需要灵活扩展功能的场景,如文本处理、日志记录、权限校验等。通过装饰器模式,代码更加灵活、可维护性更高。

yuanpan的专栏 1232

C# 设计模式 装饰器模式

设计模式 装饰器模式

廷益_飞鸟的博客 436

【结构型设计模式】C#设计模式之装饰器模式

装饰器模式是一种结构型设计模式,它允许在不改变已有对象的基础上,动态地将功能附加到对象上。它通过创建一个包装器(装饰器)来包裹原始对象,并提供额外的功能。假设你正在开发一个电子商务平台,在该平台上可以销售各种商品。在C#中,可以使用装饰器模式来实现对已有类的功能扩展,而无需修改已有类的代码。

csdn2990的博客 358

设计模式之 装饰器模式 C# 范例

Drink// 装饰器基类,继承自 IDrink 并包含对 IDrink 的引用// 默认返回基础饮品的价格// 默认返回基础饮品的描述。

搁浅的博客 592

C# 设计模式:装饰器模式与代理模式的区别

尽管装饰器模式和代理模式看起来很相似,都是通过包装对象来增强或控制对象的行为,但它们有不同的设计目的和使用场景。装饰器模式主要用于增强对象的功能,而代理模式则主要用于控制访问,尤其是延迟加载、权限控制等。理解这两者的区别,可以帮助我们在开发中做出更加合适的设计决策。在实际开发中,当你需要扩展对象的功能时,可以考虑使用装饰器模式;而当你需要控制对象的访问或者做一些额外的管理时,可以考虑使用代理模式。

玉面小浪君的博客 1480
上一篇: C#设计模式--适配器模式
下一篇: C#设计模式--代理模式
JiYF
博客等级 码龄11年 356粉丝 50原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值