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

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

时间:2023-10-02 13:45:13浏览次数:35  
标签: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"。

 

在线演示:https://www.clw9335.com/gl/gonglue/

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

相关文章

  • [题解]AT_abc245_f [ABC245F] Endless Walk
    思路首先我们可以发现,在任意一个节点数量大于\(1\)的强连通分量中的点都满足条件。所以,我们可以对这张图跑一边TarJan。但是这样是错的,因为我们还需要考虑节点数量为\(1\)的强连通分量。如果这种连通分量能够到达任意一个节点数量大于\(1\)的强连通分量,那么,这个连通分......
  • Odoo 页面-‘action’-官方文档解释
    1、图示总概览-动作分类窗口动作(WindowActions)------(ir.actions.act_window)网址URL动作(URLActions)------(ir.actions.act_url)服务器动作(ServerActions)------(ir.actions.server)报告动作(ReportActions)------(ir.actions.report.xml)客户动作(ClientActions)------(ir.a......
  • 第一周 安装rocky 8.5
    1、下载RockyLinux官方镜像8.5  1.1打开网址直接下载http://dl.rockylinux.org/vault/rocky/8.5/isos/x86_64/Rocky-8.5-x86_64-dvd1.iso2.创建虚拟机导入iso文件,进入RockyLinux的初始安装界面,选择installRockyLinux8后,按下回车键enter,开始安装RockyLinux。  ......
  • CSES.1141 C++题解
    题意传送门有一个长度为\(n\)的歌单,问最长多少首歌互不相同?每首歌用一个\(1-10^9\)的整数表示。样例输入812132742样例输出5算法双指针算法。桶思想。对于歌单中重复出现的数,可以用桶来存储。定义两个指针i,j,i指向大数,j指向小数。当出现某个桶的数大于1时,则......
  • 如何获取 C#程序 内核态线程栈
    一:背景1.讲故事在这么多的案例分析中,往往会发现一些案例是卡死在线程的内核态栈上,但拿过来的dump都是用户态模式下,所以无法看到内核态栈,这就比较麻烦,需要让朋友通过其他方式生成一个蓝屏的dump,这里我们简单汇总下。二:如何生成内核态dump1.案例代码为了方便演示,来一段简单的......
  • C# 调用存储过程
    转载:https://blog.csdn.net/m372838677/article/details/121360607 stringconnString="Server=MATEBOOK16S\\SQLEXPRESS;DataBase=MISDB;Uid=sa;Pwd=123456";voidStoredProcedure(){ using(SqlConnectionconn=newSqlConnection(connString)) { try { ......
  • Torch not compiled with Cuda enabled 解决办法
    确保下方指令运行有效:nvcc--version进入指定虚拟环境下运行下方指令:condainstallpytorch==1.11.0torchvision==0.12.0torchaudio==0.11.0cudatoolkit=11.3-cpytorch参考来源......
  • clion解决乱码问题
    文件编码修改为如下编码......
  • oracle教程:创建手动刷新的物化视图
    创建物化视图的语法1、物化视图概念:将视图中查询出来的数据存储到一张表中。2、优点:查询速度比视图要快。3、缺点:占用资源,并且要时时更新数据。4、创建物化视图CREATEMETERIALIZEDVIEWview_name[BUILDIMMEDIATE|BUILDDEFERRED]REFRESH[FAST|COMPLETE|FORCE][ON[CO......
  • chat2db教程:根据对话内容生成SQL语句
    准备示例表--学生信息表droptableifexistsSTUDENT;CREATETABLEstudent(idINTPRIMARYKEYAUTO_INCREMENTCOMMENT'学生ID',nameVARCHAR(50)NOTNULLCOMMENT'学生姓名',genderVARCHAR(10)NOTNULLCOMMENT'学生性别',birthdayDATEN......