Nul*_*lle 2 c# design-patterns decorator
我刚刚开始使用 C# 研究装饰器设计模式。
我做了一个例子,除了一件事之外,它的功能与我认为的预期一致。
我有点理解该模式的全部要点是动态地向对象添加功能。
所以当我创建这样的对象时:
Inventory a = new Ashbringer(new TravelersBagpack());
a.Execute();
Run Code Online (Sandbox Code Playgroud)
然后我有点期望重点是该a对象现在能够调用Execute()仅存在于Ashbringer类中的方法。从而向a对象添加功能。
Execute()尽管如此,如果不将方法添加到接口中,我就无法做到这一点,这Inventory最终意味着我必须向所有实现接口或抽象装饰器的Execute()类实现该方法。Inventory
也许我对接口有一两件事不了解,或者也许我误解了装饰器设计模式的要点?
装饰器模式更多的是更改正在装饰(包装)的对象的现有方法的行为,而不是添加新方法。虽然装饰器当然可以有自己的方法,但其目的是可以将装饰器视为它所包装的对象。
考虑Stream.NET 中的类。Stream是一个常见的抽象类,它简单地定义了用于读取和写入流的基本接口,但具体的子类FileStream提供了读取/写入文件的实现。但是,如果您想向类添加缓冲或压缩行为FileStream,您就不会想要子类化FileStream,因为这样您的子类将无法与NetworkStream或 一起使用,MemoryStream除非您也为它们创建了子类。
这就是装饰器模式的用武之地。 ABufferedStream或CompressedStream类可以“装饰” 的另一个实例Stream。您可以读取/写入任何未修饰的流BufferedStream,或者CompressedStream与读取/写入任何未修饰的流相同。它通过重写类的方法来实现这一点Stream,通过对传入或传出流的字节执行任何操作来添加其功能,然后将它们传递到包装的对象上,无论它是 、FileStream,NetworkStream还是另一个装饰器。
但回到你的《魔兽世界》例子,也许更好的例子是一个EnchantedWeapon类或一个TransmogrifiedWeapon充当武器类装饰器的类。然后你可以做类似的事情:
Weapon w = new Ashbringer();
w = new TransmogrifiedWeapon(w, "Exodar Bastard Sword");
w = new EnchantedWeapon(w, "Scourgebane");
w.Render();
Run Code Online (Sandbox Code Playgroud)
当然,这显然会抛出一个例外,因为每个人都知道灰烬使者无法幻化。:)