可替代面向对象设计模式的功能或动态技术示例

时间:2011-04-13 08:03:10

标签: c# design-patterns dynamic lambda functional-programming

这与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模式的吸引力降低。

4 个答案:

答案 0 :(得分:8)

设计模式不会因为单一语言的发展而过时。 模式通常与语言无关

从某种意义上说,你可以说.NET已经在.NET 1.0中使 Observer 模式'已经过时'。但是,这并不正确,因为模式没有过时 - 框架只提供了模式的默认实现,这意味着您很少自己实现它

在同样的意义上,您可以说delegates are just anonymous interfaces,因此Func<T> 抽象工厂

模式不会因为语言为他们提供惯用支持而消失。

答案 1 :(得分:2)

作为.net或C#的一部分提供的一些模式的示例,这些模式未由程序员明确实现。我正在提供有关.net的答案,而不是针对C#

  1. 迭代器模式:通过使用List&lt;&gt;或集合&lt;&gt;开发人员默认获得IEnumerable的实现。因此,不需要显式实现。但话说回来,有人(在这种情况下,.net框架)正在为开发人员实现模式。
  2. OOAD设计模式不会过时,但开发人员无需了解使用此类模式的实现。

    1. Object.Clone()是另一个例子 - 原型设计。开发人员需要根据需求实现浅或深拷贝。但.net框架保证支持原型模式。

    2. 装饰器 - 使用XAML,您可以装饰具有额外职责的UI控件。文本框可以用边框颜色,宽度和宽度进行装饰。等等。

    3. 事件的隧道和冒泡是一个链或责任模式的例子

    4. 事件是.net中的一等公民,无需从头开始实施。这是Observer模式的一个例子,程序员可以使用它而无需从头开始实现。

答案 2 :(得分:1)

您有访问者模式,如本答案中所述:

Inheritance and service class

答案 3 :(得分:1)

当然,显而易见的是战略模式,也可以通过高阶函数来完成。