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

Examples of functional or dynamic techniques that can substitute for object oriented Design Patterns

这与函数式编程是否取代了GOF设计模式有些关系?

由于C中引入了lambda和dynamics,是否有任何标准设计模式可以被认为是过时的,或者可以使用lambda或其他语言特性以其他方式解决?

例如,C的动态特性现在可以用于执行多种方法。http://achoiusa.wordpress.com/2009/08/27/exploring-c-4-0-multimethods/(我想马克·格雷维尔有关于这个的帖子吗?)

就我个人而言,我现在倾向于使用T的功能来做工厂。

例如

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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模式的吸引力。


设计模式不会因为单一语言的发展而过时。模式通常是语言不可知论。

在某种意义上,您可以说.NET已经使.NET 1.0中的观察者模式"过时"。但是,这并不真正正确,因为模式没有变得过时——框架只是提供了模式的默认实现,这意味着您很少需要自己实现它。

从同样的意义上说,委托只是匿名接口,所以Func是一个抽象工厂。

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


作为.NET或C的一部分提供的一些模式的示例,这些模式不是由程序员显式实现的。我提供了有关.NET的一般回答,而不是特定于C#

  • 迭代器模式:通过使用list<>或collection<>开发人员默认获取IEnumerable的实现。因此,不需要显式实现。但是已经说过,有人(在本例中是.NET框架)正在为开发人员实现该模式。
  • OOAD设计模式不会过时,但是开发人员不需要知道使用这种模式的实现。

  • object.clone()是另一个示例-原型设计。开发人员只需要根据需求实现浅拷贝或深拷贝。但是.NET框架保证支持原型模式。

  • decorator-使用XAML,您可以用额外的职责来修饰UI控件。文本框可以用边框颜色、宽度等进行装饰。

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

  • 事件是.NET中的头等公民,无需从头开始实施。这是一个观察者模式的例子,程序员不需要从头实现就可以使用它。


  • 当然,最明显的是策略模式,也可以用高阶函数来实现。


    您可以使用本答案中描述的访客模式:

    继承和服务类