san*_*ngh 17 c# design-patterns
在首先描述我的问题之前,我想定义Decorator和Extension方法Decorator的定义
动态地将附加职责附加到对象.装饰器为子类化提供了灵活的替代扩展功能
扩展方法
扩展方法使您可以向现有类型"添加"方法,而无需创建新的派生类型,重新编译或以其他方式修改原始类型
我在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);
}
}
Run Code Online (Sandbox Code Playgroud)
在上面的代码中,我在不修改现有代码的情况下扩展接口,并且这两种方法可用于派生类.所以我的问题是:扩展方法是否取代了装饰模式?
slo*_*oth 20
扩展方法实际上只是用于调用静态方法的语法糖.
虽然使用装饰器实际上可以改变装饰类的行为,但扩展方法只能改变属性或调用类的方法,就像"普通"静态方法一样.
装饰器模式实际上被定义为使用包装器来改变行为,扩展方法显然不会这样做.
扩展方法是装饰者模式还是访问者模式?阅读后,我会说它更类似于访客。
引用维基百科的伟大之处,永远不会出错的百科:P
在面向对象的编程和软件工程中,访问者设计模式是一种将算法与其操作的对象结构分离的方法。这种分离的实际结果是能够在不修改现有对象结构的情况下向现有对象结构添加新操作。这是轻松遵循开放/封闭原则的一种方法。本质上,访问者允许在不修改类本身的情况下向类族添加新的虚函数;相反,我们创建了一个访问者类,该类实现了虚函数的所有适当的特化。访问者将实例引用作为输入,通过双重调度实现目标。
扩展方法不是装饰器模式的替代.扩展方法用于为现有类型提供功能,而无需创建派生类型.
这与传统的装饰模式实现不同.装饰器模式允许您在运行时动态地为对象提供多个行为,而无需为这些行为的每个组合创建新的子类.