c# - 装饰器设计模式 : What is meant by adding functionality?

标签 c# design-patterns decorator

我刚刚开始使用 C# 研究装饰器设计模式。

我做了一个例子,除了一件事外,它的功能和我认为的一样。

我有点理解该模式的全部要点是动态地向对象添加功能。

所以当我像这样创建一个对象时:

Inventory a = new Ashbringer(new TravelersBagpack());
a.Execute();

然后我有点期待的是 a 对象现在可以调用仅存在于 Ashbringer< 中的 Execute() 方法类。从而向 a 对象添加功能。

虽然我不能不将 Execute() 方法添加到 Inventory 接口(interface),这最终意味着我将不得不实现 Execute( ) 方法到所有实现 Inventory 接口(interface)或抽象装饰器的类。

也许我对接口(interface)有一两件事不了解,或者我误解了装饰器设计模式的要点?

最佳答案

Decorator 模式更多地是关于更改您正在装饰(包装)的对象的现有方法的行为,而不是添加新方法。虽然装饰器当然可以有自己的方法,但目的是装饰器可以被视为它正在包装的对象。

考虑 .NET 中的 Stream 类。 Stream 是一个常见的抽象类,它简单地定义了一个用于读写流的基本接口(interface),但是像 FileStream 这样的具体子类提供了读写文件的实现。但是,如果您想向 FileStream 类添加缓冲或压缩行为,则不会希望将 FileStream 子类化,因为这样您的子类将无法与 一起使用NetworkStreamMemoryStream 除非您还为它们创建了子类。

这就是装饰器模式的用武之地。BufferedStreamCompressedStream 类可以“装饰”Stream 的另一个实例。您可以从 BufferedStreamCompressedStream 读取/写入,就像您对任何未修饰的流读取/写入一样。它通过覆盖 Stream 类的方法来实现这一点,通过对进出流的字节执行任何操作来添加其功能,然后将它们传递给包装对象,无论它是 FileStreamNetworkStream,甚至是其他装饰器。

但回到您的 WoW 示例,也许更好的示例是 EnchantedWeapon 类或 TransmogrifiedWeapon 类,它们将充当 Weapon 类的装饰器。然后你可以这样做:

Weapon w = new Ashbringer();
w = new TransmogrifiedWeapon(w, "Exodar Bastard Sword");
w = new EnchantedWeapon(w, "Scourgebane");
w.Render();

当然,这显然会引发异常,因为每个人都知道 Ember 使者无法幻化。 :)

关于c# - 装饰器设计模式 : What is meant by adding functionality?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43128134/

相关文章:

c# - 重构静态类以将其接口(interface)与实现分离

c# - 如何在通过 C# 自动化时禁用 Excel 中的兼容性检查

node.js - 编写大量类似函数/流程的最佳实践

c# - 寻找一种创造性的设计模式

具有函数计数器变量的 Python 装饰器类

c# - 使用最新的 Monodevelop 和 VS 2012 RC 共享代码时出现问题

c# - 有没有办法检查数据库中是否存在随机生成的数字? C#

java - 什么是针对接口(interface)编程而不是针对实现编程

python - 是否可以使用带参数的 Python 类装饰器?

javascript - 通过装饰器添加功能