C#设计模式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"。
C#设计模式19——装饰器模式的写法的更多相关文章
- python 设计模式之装饰器模式 Decorator Pattern
#写在前面 已经有一个礼拜多没写博客了,因为沉醉在了<妙味>这部小说里,里面讲的是一个厨师苏秒的故事.现实中大部分人不会有她的天分.我喜欢她的性格:总是想着去解决问题,好像从来没有怨天尤人 ...
- PHP设计模式之装饰器模式(Decorator)
PHP设计模式之装饰器模式(Decorator) 装饰器模式 装饰器模式允许我们给一个类添加新的功能,而不改变其原有的结构.这种类型的类属于结构类,它是作为现有的类的一个包装 装饰器模式的应用场景 当 ...
- python设计模式之装饰器模式
装饰器模式 装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构.这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装. 这种模式创建了一个装饰 ...
- PHP设计模式之装饰器模式
装饰器模式:如果已有对象的部分内容或功能性发生改变,但是不需要修改原始对象的结构或不使用继承,动态的扩展一个对象的功能,则应该使用装饰器模式.简单点说:就是我们不应该去修改已有的类,而是通过创建另外一 ...
- java设计模式之 装饰器模式
装饰器模式 装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构. 这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装. 这种模式创建了一个装 ...
- php设计模式八-----装饰器模式
1.介绍: 装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构.这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装. 这种模式创建了一个装饰 ...
- Java设计模式系列-装饰器模式
原创文章,转载请标注出处:<Java设计模式系列-装饰器模式> 一.概述 装饰器模式作用是针对目标方法进行增强,提供新的功能或者额外的功能. 不同于适配器模式和桥接模式,装饰器模式涉及的是 ...
- c#设计模式之装饰器模式(Decorator Pattern)
引子 在面向对象语言中,我们常常会听到这样一句话:组合优于继承.那么该如何去理解这句话呢? 下面我将以游戏装备为模型用简单的代码去展示它 先创建一个装备的抽象类,然后创建刀枪2个具体的业务子类 pub ...
- 设计模式之装饰器模式(PHP实现)
/** * 装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构.这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装. * 这种模式创建了一个 ...
- 23种设计模式之装饰器模式(Decorator Pattern)
装饰器模式(Decorator Pattern) 允许向一个现有的对象添加新的功能,同时又不改变其结构.这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装. 这种模式创建了一个装饰类,用来包 ...
随机推荐
- Redis 缓存雪崩 |击穿 |穿透 概念及解决方案
一.雪崩 1.概念 指某一时间段,缓存集中过期失效,无数的请求绕开缓存,直接访问数据库. 2.解决方案 让redis数据永不过期,这种方式最可靠的.最安全的,但占用空间,内存消耗大,并且不能保持数据 ...
- DIYAUDIO LM3886空板、套件、成品机DIY
diyaudio 3886空板,3886纯后级功放板.最后三张图为成品板子演示图.正确安装后,没有底噪.大水塘电容直径最大35MM.本人已经用这快板子制作了多台成品机,用过的都说好!空板20元,全部1 ...
- Go 语言 new 和 make 关键字的区别
原文链接: Go 语言 new 和 make 关键字的区别 本篇文章来介绍一道非常常见的面试题,到底有多常见呢?可能很多面试的开场白就是由此开始的.那就是 new 和 make 这两个内置函数的区别. ...
- 最新版本 Stable Diffusion 开源AI绘画工具之部署篇
目录 AI绘画 本地环境要求 下载 Stable Diffusion 运行启动 AI绘画 关于 AI 绘画最近有多火,既然你有缘能看到这篇文章,那么相信也不需要我过多赘述了吧? 随着 AI 绘画技术的 ...
- 三分钟速览GPT系列原理
其中,Transformer和BERT来自Google,GPT系列[GPT.GPT-1.GPT-2.GPT-3.ChatGPT.GPT-4]来自OpenAI. GPT Paper名为Improving ...
- JavaScript快速入门(二)
文件中引入JavaScript 嵌入到HTML文件中 在body或者head中添加script标签 <script> var age = 10; console.log(age); < ...
- OpenWRT实现NAT64/DNS64
OpenWRT实现NAT64/DNS64 连接到核心路由器 # 连接到核心路由器 [C:\~]$ ssh root@10.0.0.1 Connecting to 10.0.0.1:22... Conn ...
- [数据库]MySQL解决:MySQLNonTransientConnectionException: Could not create connection to database server.【待完善】
场景复现 mysql数据库 5.7.24 jdbc driver: mysql-connector-java: 5.1.33 jdbc 配置: + jdbc.url + driverName: Tom ...
- 四月六号java基础学习
四月六号 1.今天学习了JAVA语言特点,有以下几个特点: 1)简单易学:相对于C/c++语言,java语言省去了指针(pointer).联合体(Unions)以及结构体(struct) 2)面向对象 ...
- 包和正则表达式 re模块的使用
包的使用: import.sys print(sys.path) #查看执行文件的环境 环境变量是以执行文件为准的,所有被导入的模块或者后续的其他文件引用的sys.path都是参照执行文件的sys.p ...