首页 > 编程语言 >C#设计模式07——装饰器模式的写法

C#设计模式07——装饰器模式的写法

时间:2023-05-09 20:35:07浏览次数:39  
标签:07 C# component 装饰 对象 IComponent Operation 设计模式 public

装饰器模式是一种结构型设计模式,可以在不修改原始对象的基础上添加新的功能和行为。该模式通过将对象包装在具有相同接口的装饰器类中来实现此目的。

以下是5W1H分析:

What(什么)?

装饰器模式是一种结构型设计模式,它允许在运行时动态地向对象添加新的功能和行为,而无需修改原始对象的代码。该模式通过将对象包装在具有相同接口的装饰器类中来实现这一目的。

Why(为什么)?

在实际开发中,有时候我们需要向一个已有的对象添加新的行为或者功能,但我们不希望直接修改该对象的代码,因为这可能会引入一些风险。装饰器模式提供了一种灵活的方式来向对象添加新的功能,同时又不必修改原始对象的代码,这使得程序更加灵活和可扩展。

How(如何)?

装饰器模式通过将对象包装在装饰器类中来实现。这些装饰器类实现了与原始类相同的接口,并保存了一个指向原始对象的引用。装饰器类可以根据需要添加或修改对象的行为,同时也可以将调用传递给原始对象。该模式允许创建一个具有多个嵌套装饰器的对象,从而创建出高度定制的对象。

 Where(在哪里使用)?

装饰器模式适用于以下场景:

- 需要动态地向对象添加新的功能,而这些功能可能会在运行时发生改变。
- 想要避免直接修改原始对象的代码,因为这可能会引入一些风险。
- 需要创建一个高度定制的对象,该对象的行为和功能与原始对象略有不同。

 Who(谁使用)?

装饰器模式适用于对代码的灵活性和可扩展性有要求的开发者。开发者需要明确了解原始代码的设计和实现,以便为其添加新的行为和功能。此外,装饰器模式还适用于需要在运行时动态地向对象添加功能的场景。


 Example(示例):

以下是一个简单的C#代码示例,演示了如何使用装饰器模式来添加新的行为和功能:

目标接口:

public interface IComponent
{
    void Operation();
}

具体组件:

public class ConcreteComponent : IComponent
{
    public void Operation()
    {
        Console.WriteLine("ConcreteComponent.Operation");
    }
}

基础装饰器类:

public class Decorator : IComponent
{
    private IComponent component;

    public Decorator(IComponent component)
    {
        this.component = component;
    }

    public virtual void Operation()
    {
        component.Operation();
    }
}

具体装饰器类:

public class ConcreteDecoratorA : Decorator
{
    public ConcreteDecoratorA(IComponent component) : base(component)
    {
    }

    public override void Operation()
    {
        base.Operation();
        Console.WriteLine("ConcreteDecoratorA.Operation");
    }
}

public 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();
        component = new ConcreteDecoratorA(component);
        component = new ConcreteDecoratorB(component);
        component.Operation();
    }
}

输出:

ConcreteComponent.Operation
ConcreteDecoratorA.Operation
ConcreteDecoratorB.Operation

 

标签:07,C#,component,装饰,对象,IComponent,Operation,设计模式,public
From: https://www.cnblogs.com/for-easy-fast/p/17386170.html

相关文章

  • 编写Dockerfile文件
    镜像是容器的基础,容器基于镜像定义的内容来运行。镜像是多层存储,每一层是前一层基础上进行的修改。定制镜像时,一般使用Dockerfile来完成。Dockerfile是一个文本文件,其内包含了一条条的指令,每一条指令构建镜像的其中一层,因此每一条指令的内容,就是描述该层应该如何构建。Dockerfil......
  • AtCoder Beginner Contest 217 G Groups
    洛谷传送门AtCoder传送门不妨钦定组之间的顺序是最小值越小的组越靠前,这样可以给每个组按顺序编号。设\(f_{i,j}\)为考虑了模\(m\)后\(<i\)的数,目前有\(j\)个非空组的方案数。转移就是枚举模\(m=i-1\)的数新开了\(k\)个组,设\(\len\)的数中模\(m=i-1......
  • Method com/mysql/jdbc/JDBC4ResultSet.getObject(Ljava/lang/String;Ljava/lang/Clas
      mybatis-plus生成的日期类型默认是localdatetime,数据库是datetime,按道理转换应该可以,我又不想把实体类转换成date查看依赖<--locadate/locadatetime的时间依赖--><dependency><groupId>org.mybatis</groupId><artifactId>mybatis-ty......
  • 粘包/拆包问题一直都存在,只是到TCP就拆不动了。
    OSIopen-system-InterconnectionTCP/IP5层协议栈应用层和操作系统的边界是系统调用,对应到网络编程是socketapiTCP/UDP概况TCP粘包问题TCP/IP报头深思OSI开放系统互联定义了网络框架,以层为单位实现协议,同时控制权逐层传递。OSI实际并没有落地,TCP/IP5层协议栈......
  • quantumPLC与南京德宏数采仪通讯,citect画面日期时间控件和复选框控件控制趋势交互功能
    这一篇笔记我在新浪博客记录过,在这里也记录一遍,新浪博客地址quantumPLC与南京德宏数采仪通讯,citect画面日期时间控件和复选框控件控制趋势交互功能_来自金沙江的小鱼_新浪博客(sina.com.cn)最近上级管理部门要求在现场生产控制计算机上新建一幅画面,生产关键参数趋势、环保监测数......
  • CRC 校验解析
    CRC校验解析一个CRC校验模型需要包含以下信息:WIDTH,指CRC校验码的最终位数(二进制)POLY,指用来做二进制除法的多项式。INIT,指CRC的初始值。存在初始值是为了避免全0数据的校验码恒为0。若初始值不为0,则对于不同长度的全0数据,校验码一般也会不一样。XOROUT,指最后对......
  • Linux 处理CPU和内存参数的方式总结
    Linux处理CPU和内存参数的方式总结关闭NUMA,关闭透明大页比较简单的方法:vim/etc/default/grub在GRUB_CMDLINE_LINUX里面添加配置:transparent_hugepage=nevernuma=off修改后的配置为:GRUB_CMDLINE_LINUX="resume=/dev/mapper/uos-swaprd.lvm.lv=uos/rootrd.lvm.......
  • KingbaseES V8R6 集群运维案例--备库timeline not contain minimum recovery point故
    ​案例现象:KingbaseESV8R6集群备库启动后,加入集群失败,sys_log日志信息提示,如下图所示:适用版本:kingbaseESV8R6一、问题分析在timeline对应的history文件中会记录每次timeline切换时所对应的lsn,如下图所示,在sys_wal目录下:.......-rw-------1kingbasekingbase1.2KFe......
  • KingbaseES V8R6 Deallocate 语句使用说明
    用途DEALLOCATE被用来释放一个之前PREPARE好的SQL语句。如果不显式地释放一个PREPARE语句,那么会话结束时会释放它。prepare语句类似oracle的绑定变量绑定过程:1)PREPARE,准备绑定变量SQL2)EXECUTE,绑定并执行3)DEALLOCATE,释放绑定变量测试1.只有本地会话可以看的prepare语句......
  • KingbaseES V8R6 最老事务阻止vacuum freeze
    前言最近生产环境发生几次由于长事务导致表、库年龄没法回收的情况。我们要规避这种情况的发生,不要等发生了再去强制中断会话连接。当数据库中存在最老事务版本xmin,那么早于他的快照可以被标记为frozen,如果在最老事务之后产生的快照版本,不被标记为frozen。这个最老事务通常被认......