Scala patterns (#4) - Strategy
策略模式是一种经典的设计模式,简而言之,就是做同一件事情,但在不同的场景中(或针对不同的对象)采用不同的算法。由于Scala简洁的语法和对高阶函数的支持,相比Java写出的代码会更加精简。
下面给出几个例子来感受一下Scala中策略模式的写法,首先是Scala in action书中的例子。
|
|
这个例子简直是简单地过分,只需要传入一个函数(参数是String类型,返回值是Double类型),借由传入函数来决定具体的计算方法(策略)就可以了。由于这个例子过分简单,我们再来看一个更具体的例子(来自Memetic Musings Blog):
|
|
这个例子更加Scala一些,其中用到了类型上限T <: TaxPayer
,意思是T为TaxPayer类型及其子类型。其实仔细一看核心部分和第一个例子是一样的,只不过多用了一些对象的继承关系,使得Strategy的声明和实现更加明确化。
最后一个例子来自于之前提到过的Design Patterns in Scala,这篇博客的好处是能看到Java实现和Scala实现的比较:
Java实现
|
|
Scala实现
|
|
是不是觉得尝到一点儿函数式编程的甜头儿了呢?:)
参考资源
- 维基百科对策略模式的定义:http://en.wikipedia.org/wiki/Strategy_pattern
- Stackoverflow中的问答:Better alternative to Strategy pattern in Scala?
- Design Patterns in Scala: http://memuser.blogspot.com/2008/03/design-patterns-in-scala.html
- 一个更加详细的策略模式实现:http://scalasim.blogspot.com/2010/09/strategy-pattern-and-traits.html
- Design Patterns in Scala again: http://pavelfatin.com/design-patterns-in-scala
- 神奇的长文:How Scala killed the Strategy Pattern