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

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

时间:2023-06-05 16:24:41浏览次数:36  
标签:Draw C# IShape public 19 添加 对象 设计模式 装饰

装饰器模式(Decorator Pattern)是一种结构型设计模式,它允许你动态地给一个对象添加一些额外的职责,而不需要修改这个对象的代码。

What(什么)

装饰器模式是一种结构型设计模式,它允许你动态地给一个对象添加一些额外的职责,而不需要修改这个对象的代码。

在装饰器模式中,你可以定义一个装饰器类,它包含一个指向被装饰对象的引用,并且实现了与被装饰对象相同的接口。装饰器类可以在运行时动态地给被装饰对象添加一些额外的行为,而不会影响到原有的行为。

Why(为什么)

在软件开发过程中,经常会遇到需要给一个对象添加一些额外的行为的情况。如果直接修改这个对象的代码,可能会引起其他代码的不稳定性,而且会导致代码的可维护性变差。此时,装饰器模式就可以很好地解决这个问题。

使用装饰器模式,你可以在运行时动态地给一个对象添加一些额外的职责,而不需要修改这个对象的代码。这样,你就可以保持原有代码的稳定性和可维护性,同时还能够满足新的需求。

How(怎么做)

装饰器模式的实现需要以下几个步骤:

1. 定义一个接口,它包含了被装饰对象和装饰器对象需要实现的方法。
2. 实现一个具体的类,它实现了这个接口,并且包含了一些基本的行为。
3. 实现一个装饰器类,它也实现了这个接口,并且包含了一个指向被装饰对象的引用。
4. 在装饰器类中,实现需要添加的额外行为,并且在调用被装饰对象的方法时,也调用相应的方法。
5. 在客户端代码中,创建一个具体的对象,并且用装饰器类动态地给它添加一些额外的行为。

 Where(在哪里使用)

装饰器模式适用于以下情况:

- 当你需要在不修改对象代码的情况下,给一个对象添加一些额外的行为时,可以使用装饰器模式。
- 当你需要动态地给一个对象添加一些额外的行为时,可以使用装饰器模式。
- 当你需要给一个对象添加一些行为,但是这些行为可能会被频繁地修改或者删除时,可以使用装饰器模式。

Who(谁使用)

装饰器模式适用于以下角色:

- Component:定义了被装饰对象和装饰器对象需要实现的方法。
- ConcreteComponent:实现了 Component 接口,并且包含了一些基本的行为。
- Decorator:实现了 Component 接口,并且包含了一个指向被装饰对象的引用。
- ConcreteDecorator:实现了 Decorator 接口,并且在调用被装饰对象的方法时,添加了额外的行为。

Example(示例)

以下是一个使用装饰器模式的示例:

// Component 接口
public interface IShape
{
    void Draw();
}

// ConcreteComponent 类
public class Rectangle : IShape
{
    public void Draw()
    {
        Console.WriteLine("Drawing a rectangle.");
    }
}

// Decorator 类
public abstract class ShapeDecorator : IShape
{
    protected IShape decoratedShape;

    public ShapeDecorator(IShape decoratedShape)
    {
        this.decoratedShape = decoratedShape;
    }

    public virtual void Draw()
    {
        decoratedShape.Draw();
    }
}

// ConcreteDecorator 类
public class RedShapeDecorator : ShapeDecorator
{
    public RedShapeDecorator(IShape decoratedShape) : base(decoratedShape)
    {
    }

    public override void Draw()
    {
        decoratedShape.Draw();
        Console.WriteLine("Border Color: Red");
    }
}

// 客户端代码
public class Client
{
    static void Main(string[] args)
    {
        // 创建一个具体的对象
        IShape rectangle = new Rectangle();

        // 用装饰器类动态地给它添加一些额外的行为
        IShape redRectangle = new RedShapeDecorator(rectangle);

        // 调用方法,输出结果
        rectangle.Draw(); // 输出 "Drawing a rectangle."
        redRectangle.Draw(); // 输出 "Drawing a rectangle." 和 "Border Color: Red"
    }
}

在上面的示例代码中,我们定义了一个 `IShape` 接口,它包含了一个 `Draw` 方法,用于绘制图形。然后,我们实现了一个 `Rectangle` 类,它实现了 `IShape` 接口,并且包含了一个基本的行为。接着,我们定义了一个 `ShapeDecorator` 抽象类,它实现了 `IShape` 接口,并且包含了一个指向被装饰对象的引用。最后,我们实现了一个 `RedShapeDecorator` 类,它继承了 `ShapeDecorator` 类,并且在调用被装饰对象的 `Draw` 方法时,添加了一个额外的行为。

在客户端代码中,我们创建了一个具体的对象 `rectangle`,然后用 `RedShapeDecorator` 类动态地给它添加了一个额外的行为。最后,我们调用了 `Draw` 方法,输出了结果。在本例中,输出了 "Drawing a rectangle." 和 "Border Color: Red"。

标签:Draw,C#,IShape,public,19,添加,对象,设计模式,装饰
From: https://www.cnblogs.com/for-easy-fast/p/17458083.html

相关文章

  • CATIA——CATIA二次开发的3种方式
        参考:http://www.tuituisoft.com/bim/26573.html......
  • 如何查找Black Hat会议文章
    BlackHat官网:https://www.blackhat.com/查看BlackHat历史文章:选择会议:选择主题:或者可以Ctrl+F搜索具体的文章......
  • C# FileUpload 实现上传限定类型和大小的文件到服务器
    上传文件有两个主要的目的地,一个是服务器,另一个是数据库,ASP.NET内置了FileUpload这个上传控件,文本框显示用户选择的文件的全名.其属性主要包括:ContenLength:上传文件大小,单位:字节FileName:文件名称HasFile:是否选择了文件例子:测试环境.net2.0(内有详细说明)default......
  • go map gc的测试代码
    **本文章由githubcopilot协助生成**遇到一个离职同事写的代码,如下:```gopackagemapGCfuncmapGc(){lock:=sync.Mutex{}gofunc(){for{time.Sleep(12*time.Hour)tmp:=make(map[string]interface{})lo......
  • Linux和Mac环境变量设置
    在linux和mac中设置环境变量我已知的有两种方式,一种是修改环境变量的文件,另一种是使用export关键字。之所以不提windows,是因为我所知的在windows上配置环境变量只有通过窗口然后点击这一种方式。以mac配置pyenv环境变量为例:1、export方式查看当前shell是zsh还是bash,如果是bas......
  • 【解决方法】loopback口添加同目的网段的地址后,无法用默认路由ping通该网段地址
    环境:工具:锐捷EVE,VMwareWorkstationPro远程工具:SecureCRT系统版本:Windows10问题描述:描述:原本可用默认路由ping该地址,但是在lookback口添加同该地址网段地址后,就无法ping通。提示:若按照教程还是无法完成操作,可以进入右侧的企鹅,找我看看。解决方法-视频与文字教程......
  • CF做题笔记
    CFR876D-BallSorting首先不考虑小球的数量,假设有充足的小球,要求最少的移动次数,我们只需要拿出序列的最长上升子序列,这就是始终不会移动的小球的数量。加上小球数量的限制。设始终不会移动的小球的集合为\(S\),显然集合需要满足单调上升,它们将整个序列分为\(f(S)\)段,那么......
  • 利用PImpl在C++14中优雅调用C++17方法
    诉求你的工程由C++14写成,某天你看中了一个功能强大的三方库,一切都好除了该库仅支持C++17编译,对于比较复杂的三方库使用C++14进行重构工作量太大,有没有优雅的办法?实现历史总是惊人的相似,为了解决这一问题前人发明了PImpl编程方法用于隐藏class的实现细节,头文件中仅声明抽象class......
  • python操作Excel,读取表格内容,并根据需求将内容填充到表格指定位置
    在日常工作中经常会遇到需要将“表一,部门信息表”内容逐行填充到“表二,个人基本信息表”的情况。表一:表二:  实现方式如下:#!usr/bin/python#-*-coding:utf-8-*-importpandasaspdimportopenpyxlasopfromopenpyxlimportWorkbookfromopenpyxlimportl......
  • 必读:学习C语言编程的路线图
    学习C语言编程,可以丰富编程思维的训练和经验,以下是一些学习C语言编程的路线图:设置开发环境:在计算机上安装C编译器。GNU编译器集合(GCC)是一个流行的选择,适用于Windows、macOS和Linux等各种操作系统。安装IDE编程环境,推荐VSCode,有丰富的插件可以辅助编程,并且辅助学习编程。使用......