这与Does functional programming replace GoF design patterns?
有些关联自从在C#中引入lambda和动态,是否有任何标准设计模式可以被认为是过时的或使用lambda或其他语言特征以其他方式解决?
例如,C#的动态功能现在可用于执行多种方法。 http://achoiusa.wordpress.com/2009/08/27/exploring-c-4-0-multimethods/ (我认为Marc Gravell有一些关于此事的帖子?)
就我个人而言,我倾向于使用现在的Func来做工厂。
e.g。
public static class SomeFactory
{
public static Func<IUnitOfWork> GetUoW =
() => new EF4UoW(new SomeModelContainer());
}
// usage
var uow = SomeFactory.GetUoW();
// testabillity
var testUoW = new InMemUoW();
testUoW.Add(new Customer()...);
SomeFactory.GetUoW = () => testUoW;
// the service can get an UoW using the factory
var result = SomeDomainService.DoStuff(...);
有人有其他例子吗?
[编辑] 当然,模式本身并没有过时,但有些模式是范式特定的,因此C#现在是多范式的,C#的一些功能特性可能会使一些OOP模式的吸引力降低。
答案 0 :(得分:8)
设计模式不会因为单一语言的发展而过时。 模式通常与语言无关。
从某种意义上说,你可以说.NET已经在.NET 1.0中使 Observer 模式'已经过时'。但是,这并不正确,因为模式没有过时 - 框架只提供了模式的默认实现,这意味着您很少自己实现它
在同样的意义上,您可以说delegates are just anonymous interfaces,因此Func<T>
抽象工厂。
模式不会因为语言为他们提供惯用支持而消失。
答案 1 :(得分:2)
作为.net或C#的一部分提供的一些模式的示例,这些模式未由程序员明确实现。我正在提供有关.net的答案,而不是针对C#
OOAD设计模式不会过时,但开发人员无需了解使用此类模式的实现。
Object.Clone()是另一个例子 - 原型设计。开发人员需要根据需求实现浅或深拷贝。但.net框架保证支持原型模式。
装饰器 - 使用XAML,您可以装饰具有额外职责的UI控件。文本框可以用边框颜色,宽度和宽度进行装饰。等等。
事件的隧道和冒泡是一个链或责任模式的例子
事件是.net中的一等公民,无需从头开始实施。这是Observer模式的一个例子,程序员可以使用它而无需从头开始实现。
答案 2 :(得分:1)
您有访问者模式,如本答案中所述:
答案 3 :(得分:1)
当然,显而易见的是战略模式,也可以通过高阶函数来完成。