gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 20:17:54 25 4
gpt4 key购买 nike

我刚刚开始使用 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com