我刚刚开始使用 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
子类化,因为这样您的子类将无法与 一起使用NetworkStream
或 MemoryStream
除非您还为它们创建了子类。
这就是装饰器模式的用武之地。BufferedStream
或 CompressedStream
类可以“装饰”Stream
的另一个实例。您可以从 BufferedStream
或 CompressedStream
读取/写入,就像您对任何未修饰的流读取/写入一样。它通过覆盖 Stream
类的方法来实现这一点,通过对进出流的字节执行任何操作来添加其功能,然后将它们传递给包装对象,无论它是 FileStream
、NetworkStream
,甚至是其他装饰器。
但回到您的 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/