c#中的装饰器模式和扩展方法
在首先描述我的问题之前,我想定义Decorator和Extension方法Decorator的定义
动态地将附加职责附加到对象。 装饰器为子类化提供了灵活的替代扩展function
扩展方法
扩展方法使您可以向现有类型“添加”方法,而无需创建新的派生类型,重新编译或以其他方式修改原始类型
我在c#中有以下代码片段
public interface IMyInterface { void Print(); } public static class Extension { public static void PrintInt(this IMyInterface myInterface, int i) { Console.WriteLine ("Extension.PrintInt(this IMyInterface myInterface, int i)"); } public static void PrintString(this IMyInterface myInterface, string s) { Console.WriteLine ("Extension.PrintString(this IMyInterface myInterface, string s)"); } } public class Imp : IMyInterface { #region IMyInterface Members public void Print() { Console.WriteLine("Imp"); } #endregion } class Program { static void Main(string[] args) { Imp obj = new Imp(); obj.Print(); obj.PrintInt(10); } }
在上面的代码中,我在不修改现有代码的情况下扩展接口,并且这两种方法可用于派生类。 所以我的问题是:扩展方法是否取代了装饰模式?
扩展方法实际上只是用于调用静态方法的语法糖。
虽然使用装饰器实际上可以改变装饰类的行为,但扩展方法只能改变属性或调用类的方法,就像“普通”静态方法一样。
装饰器模式实际上被定义为使用包装器来改变行为,扩展方法显然不会这样做。
你错过了装饰图案的动态部分。 扩展方法是在编译时定义的静态动物,可以使用或不使用……但不能在运行时修改/交换。
扩展方法不是装饰器模式的替代。 扩展方法用于为现有类型提供function,而无需创建派生类型。
这与传统的装饰模式实现不同。 装饰器模式允许您在运行时动态地为对象提供多个行为,而无需为这些行为的每个组合创建新的子类。
扩展方法是Decorator模式还是Visitor模式? 阅读后我会说它更像是访客。
引用伟大的维基百科,从未有错误的小儿节:P
在面向对象的编程和软件工程中,访问者设计模式是一种将算法与其操作的对象结构分离的方法。 这种分离的实际结果是能够在不修改这些结构的情况下向现有对象结构添加新操作。 这是轻松遵循开放/封闭原则的一种方式。 从本质上讲,访问者允许在不修改类本身的情况下向一个类族添加新的虚函数; 相反,我们创建了一个访问者类,它实现了虚函数的所有适当的特化。 访问者将实例引用作为输入,并通过双重调度实现目标。
Erich Gamma(GoF)的解释似乎是最好的… http://www.mif.vu.lt/~plukas/resources/Extension%20Objects/ExtensionObjectsPattern%20Gamma96.pdf
基本上说明了这一点
a)将不同客户端(当前和未来)所需的所有操作和状态组合到单个接口中,从而产生臃肿的接口
b)期望的操作(已知和未知)可以分类为组件。 可以定义一个(或多个)组件接口(扩展接口)。 这些可能是也可能不是由对象(当前和未来)实现的。
c)希望使用此扩展接口的客户端可以查询组件是否支持它
d)最后,这个扩展接口有一个公共基类(ComponentExtension),它具有最小的接口来管理扩展本身(检查扩展是否存在,通知扩展它将要删除)
在以下情况下使用:
1当您的现有类可能需要额外的和不可预见的接口(即新的,当前未知的行为模式)时。
2当代表关键抽象的类为不同的客户端扮演不同的(不可预见的和开放式的)角色时。
3您希望在不进行分类的情况下进行扩展
它类似于以下模式
需要稳定的类层次结构并引入依赖循环的访问者
装饰器使用更透明,界面狭窄,现有操作应该增加
适配器 ,支持EXISTING接口