首页 > 代码库 > 8.2.1 策略设计模式(The strategy design pattern)

8.2.1 策略设计模式(The strategy design pattern)

8.2.1 策略设计模式(The strategy design pattern)

 

在运行时,如果应用程序需要在几种算法之间,或一种算法的不同部分之间进行选择的话,策略模式是非常有用的。一种常见的情况是,当我们的应用程序需要执行的几个任务,只在很小的子任务上是不同的。使用策略模式,对于任务的公用部分,我们只要写一次,加上参数化,子任务(原始操作)作为它的参数值。图 8.1 显示了用面向对象表示的策略模式。


图 8.1 Strategy是一个接口,有表示原始操作的方法。两个具体策略实现不同的操作,Context 类可以在这些实现之间选择

 

把任务参数化,是给它一个子任务作为参数值,有可能使策略模式在函数式编程中的看起来更清晰:它只是一个高阶函数。图 8.1 中的 Strategy 接口只有一个方法,表明它是一个简单的函数;实现它的两个类是有效的具体函数,可以使用 lambda 函数创建。

在支持函数的语言中,我们可以用适当的函数(在 C# 中的 Func 委托或 F# 中的函数类型)替换 Strategy 接口。 通常情况下,我们直接把策略作为参数值,传递给 Operation 方法。使用图 8.1 中的抽象名,我们可以写成:

 

Context.Operation(arg => { 

  //Implements the specificstrategy 

});

 

我们已经看到过这种模式在筛选列表时的示例。在这种情况下,描述条件的函数是具体的策略(我们可以使用不同的策略写出不同的筛选器),List.filter 函数或 Where 方法是相当的操作。这就是说,在支持高阶函数的语言中,可以随时用高阶函数替换策略模式。

下一个模式有点类似,但与我们前面讨论的以行为为中心的应用程序中,处理行为列表更相关。

8.2.1 策略设计模式(The strategy design pattern)