可以替代面向对象设计模式的功能或动态技术示例
Posted
技术标签:
【中文标题】可以替代面向对象设计模式的功能或动态技术示例【英文标题】:Examples of functional or dynamic techniques that can substitute for object oriented Design Patterns 【发布时间】:2011-08-04 12:08:32 【问题描述】:这和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 of T 来做工厂。
例如
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 模式的吸引力。
【问题讨论】:
【参考方案1】:设计模式不会因为单一语言的发展而过时。 模式通常与语言无关。
从某种意义上说,您可以说 .NET 使 Observer 模式在 .NET 1.0 中已经“过时”了。但是,这并不完全正确,因为 模式并没有过时 - 框架只是提供了该模式的默认实现,这意味着您很少需要自己实现它 .
在同样的意义上你可以说delegates are just anonymous interfaces,所以Func<T>
是一个抽象工厂。
模式不会因为语言为它们提供惯用支持而消失。
【讨论】:
>> "模式通常与语言无关" ,不完全是,OOP 和 FP 语言有不同的模式.. @Roger Alsing:OOP 和 FP 不是语言,而是范式。同意它们有不同的模式,但在一个范式中,模式通常与语言无关。 是的,我只是想指出“语言不可知论”过于宽泛,“范式中的语言不可知论”在 IMO 中更为正确。因此,如果一个范式解决了另一个范式需要模式来解决的问题,那么人们可能会争辩说,在支持这两种范式的语言中不再需要该模式..【参考方案2】:作为 .net 或 C# 的一部分提供但程序员未明确实现的一些模式示例。我一般提供关于 .net 的答案,而不是特定于 C#
-
迭代器模式:通过使用 List 或 Collection,开发人员默认获取 IEnumerable 的实现。因此,不需要显式实现。但话虽如此,有人(在本例中为 .net 框架)正在为开发人员实现该模式。
OOAD 设计模式不会过时,但开发人员无需了解实现即可使用此类模式。
Object.Clone() 是另一个示例 - 原型设计。开发人员只需根据需求实现浅拷贝或深拷贝。但.net 框架保证支持原型模式。
装饰器 - 使用 XAML,您可以装饰具有额外职责的 UI 控件。文本框可以用边框颜色、宽度等进行装饰。
事件的隧道和冒泡是链或责任模式的一个示例
事件是 .net 中的一等公民,无需从头开始实施。这是一个观察者模式的例子,程序员无需从头实现即可使用。
【讨论】:
【参考方案3】:您拥有此答案中描述的访客模式:
Inheritance and service class
【讨论】:
【参考方案4】:当然,最明显的就是策略模式,也可以用高阶函数来实现。
【讨论】:
以上是关于可以替代面向对象设计模式的功能或动态技术示例的主要内容,如果未能解决你的问题,请参考以下文章
java反射并不是什么高深技术,面向对象语言都有这个功能,而且功能也很简单,就是利用jvm动态加载时生成的class对象