装饰器模式(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"。

C#设计模式19——装饰器模式的写法的更多相关文章

  1. python 设计模式之装饰器模式 Decorator Pattern

    #写在前面 已经有一个礼拜多没写博客了,因为沉醉在了<妙味>这部小说里,里面讲的是一个厨师苏秒的故事.现实中大部分人不会有她的天分.我喜欢她的性格:总是想着去解决问题,好像从来没有怨天尤人 ...

  2. PHP设计模式之装饰器模式(Decorator)

    PHP设计模式之装饰器模式(Decorator) 装饰器模式 装饰器模式允许我们给一个类添加新的功能,而不改变其原有的结构.这种类型的类属于结构类,它是作为现有的类的一个包装 装饰器模式的应用场景 当 ...

  3. python设计模式之装饰器模式

    装饰器模式 装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构.这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装. 这种模式创建了一个装饰 ...

  4. PHP设计模式之装饰器模式

    装饰器模式:如果已有对象的部分内容或功能性发生改变,但是不需要修改原始对象的结构或不使用继承,动态的扩展一个对象的功能,则应该使用装饰器模式.简单点说:就是我们不应该去修改已有的类,而是通过创建另外一 ...

  5. java设计模式之 装饰器模式

    装饰器模式 装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构. 这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装. 这种模式创建了一个装 ...

  6. php设计模式八-----装饰器模式

    1.介绍: 装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构.这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装. 这种模式创建了一个装饰 ...

  7. Java设计模式系列-装饰器模式

    原创文章,转载请标注出处:<Java设计模式系列-装饰器模式> 一.概述 装饰器模式作用是针对目标方法进行增强,提供新的功能或者额外的功能. 不同于适配器模式和桥接模式,装饰器模式涉及的是 ...

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

    引子 在面向对象语言中,我们常常会听到这样一句话:组合优于继承.那么该如何去理解这句话呢? 下面我将以游戏装备为模型用简单的代码去展示它 先创建一个装备的抽象类,然后创建刀枪2个具体的业务子类 pub ...

  9. 设计模式之装饰器模式(PHP实现)

    /** * 装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构.这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装. * 这种模式创建了一个 ...

  10. 23种设计模式之装饰器模式(Decorator Pattern)

    装饰器模式(Decorator Pattern) 允许向一个现有的对象添加新的功能,同时又不改变其结构.这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装. 这种模式创建了一个装饰类,用来包 ...

随机推荐

  1. 《爆肝整理》保姆级系列教程-玩转Charles抓包神器教程(12)-Charles如何使用Repeat功能进行简单压力测试

    1.前言 李四:"今天好累啊,点的我手指都疼了.我一直被要求给后端接口的同事重复发送请求来调试接口." Charles:"哎呀,李四同学,你怎么能一条一条的手动发送呢 我 ...

  2. Django笔记八之model中Meta参数的使用

    前面介绍了 model 的字段属性,字段类型,这篇笔记介绍一下 model 的 Meta 选项. 这个选项提供了一些参数,比如排序(ordering),表名(db_table)等. 但这都不是必需的, ...

  3. 【LeetCode动态规划#04】不同的二叉搜索树(找规律,有点像智力题)

    不同的二叉搜索树 力扣题目链接(opens new window) 给定一个整数 n,求以 1 ... n 为节点组成的二叉搜索树有多少种? 示例: 思路 题意分析 先找一下关系 当n = 1时,如果 ...

  4. pack.json中的^ ~的区别

    在版本说明前面还有个符号:'^'(插入符号)和'~'(波浪符号),他们之间的区别:例如: '~'(波浪符号):他会更新到当前minor version(也就是中间的那位数字)中最新的版本.放到我们的例 ...

  5. 别逛了,送你一份2023年Java核心篇JVM(虚拟机)面试题整理

    Java内存区域 说一下 JVM 的主要组成部分及其作用? JVM包含两个子系统和两个组件,两个子系统为Class loader(类装载).Execution engine(执行引擎):两个组件为Ru ...

  6. pywin32获取键盘状态,附带键位码

    import win32apiimport win32con win32con.VK_CAPITAL # 20获取Caps Lock键编码 win32api.GetKeyState(win32con. ...

  7. python之pdf转换操作 PyMuPDF库学习

    1. 资料链接github地址: pymupdf/PyMuPDF: Python bindings for MuPDF's rendering library官方手册: PyMuPDF Documen ...

  8. pandas之聚合函数

    在<Python Pandas窗口函数>一节,我们重点介绍了窗口函数.我们知道,窗口函数可以与聚合函数一起使用,聚合函数指的是对一组数据求总和.最大值.最小值以及平均值的操作,本节重点讲解 ...

  9. Android HAL机制的深入理解及在Linux上移植和运行的一个好玩的HAL小例子

    PS:要转载请注明出处,本人版权所有. PS: 这个只是基于<我自己>的理解, 如果和你的原则及想法相冲突,请谅解,勿喷. 环境说明   Ubuntu 18.04.x 前言   近一年来, ...

  10. LeeCode数组问题(二)

    LeeCode 977:有序数组的平方 题目描述: 给你一个按非递减顺序排列的整数数组nums,返回每个数字的平方组成的新数组,要求也按非递减顺序排序. 标签:数组,首尾指针,最大值优先 时间复杂度: ...