哪些设计模式适用于lambdas?

时间:2011-08-08 02:46:44

标签: design-patterns lambda

您发现哪些设计模式适用于lambda表达式/函数?

3 个答案:

答案 0 :(得分:2)

现在,Lambda已广泛用于IoC容器和DI(例如模拟框架)

我可以在这个区域看到以下GoF模式:

Moq正在使用Proxy模式并积极使用lambdas;例如:

var mock = new Mock<IFoo>();
mock.Setup(foo => foo.DoSomething("ping")).Returns(true);

你可以发现lambdas有助于在IoC容器中实现Singleton模式,例如autofac,而不像通常的Singleton那样限制自己的可测试性:

builder.Register(c => new MyClass()).SingleInstance();

Factory Method模式通过使用参数作为类型注册来证明构造函数调用:

builder
    .Register(c => new ObjectContainer(ConnectionStrings.CustomerDB))
    .As<IObjectContainer>()
    .Named("CustomerObjectContainer");

另外

Expression <TDelegate>类也与Interpreter模式

密切相关

答案 1 :(得分:1)

在某些情况下,我看到他们使用了一点点:

首先,它们非常适合对集合进行高级迭代。通常,我们只需要将某种转换应用于列表或树或其他东西。使用lambdas可以使收集处理的代码易于使用和紧凑。对于一个随机无意义的例子(在使用LINQ的C#中):

var list = new List<int>();
//...
list.Where(x => x < 10).Aggregate( (current, total) => total + current * current );

如果没有lambdas,这种代码将会非常隐蔽且不必要地大。

当使用围绕回调的API时,它们也很方便,因为很多时候我们只需要使用一次回调。它不得不编写用于一次性使用的完整函数,因为这只是使命名空间混乱的额外代码。

最后一个设计模式来自JavaScript。我不确定这是否适用于一般的lambdas,因为我不知道闭包是否是lambdas的必需组件。但是由于许多语言允许lambdas关闭变量,所以无论如何我都会提到它。

您可能知道或不知道,JavaScript能够通过基于原型的继承进行面向对象的设计。但缺点是它没有数据抽象的概念。然而,不久前发现lambda实际上可以用来提供数据抽象。通过使用匿名函数(实际上是lambdas)的闭包,我们可以实现这一点:

function Rectangle(width, height) {
    this.getWidth = function() { return width; }
    this.getHeight = function() { return height; }
}

由于getWidthgetHeight定义的闭包包含widthheight参数,因此参数仍然可以从这些方法中使用。但是它们不会在其他任何地方维护,因此一旦Rectangle构造函数退出,其他代码就无法访问它们。因此,widthheight现在是Rectangle的私有,只能通过提供的访问者方法访问。

除此之外,我会说lambdas对他们有一个很好的理论感受。支持他们的语言感觉更完整,限制更少,更少杂乱。

答案 2 :(得分:0)

Monadic模式完全基于lambda,只能在使用lambda时实现。 C#中monad的解释: http://ericlippert.com/category/monads/

C ++中的Monads: http://bartoszmilewski.com/2011/07/11/monads-in-c/

的Python: http://www.valuedlessons.com/2008/01/monads-in-python-with-nice-syntax.html