Scala patterns (#6) - Kestrel combinator

Kestrel combinator并不是一种传统的设计模式,这个叫法是在1985年出版的To Mock the Mockingbird这本书里提到的,可以参考Scala in action作者引用的资源地址详细了解这种模式,其中的例子使用的是Ruby语言。我理解这种模式的意义主要是产生副作用,即在不改变原有类或对象定义的情况下,使用一段附加函数体来达到产生副作用的目的。

这种模式在不同的语言里实现的方式也不一样。下面的一个例子来自Scala in action,其中使用了Scala的隐式转换(Implicit Conversion)特性来实现Kestrel combinator:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
object Combinators {
implicit def kestrel[A](a: A) = new {
def tap(sideEffect: A => Unit): A = {
sideEffect(a)
a
}
}
}
case class Person(firstName: String, lastName: String)
case class Mailer(mailAddress: String) {
def mail(body: String) = { println("Send mail here" )}
}
object DemoKestrel extends App {
import Combinators._
Person("Nilanjan", "Raychaudhuri").tap(
p => {
println("First name" + p.firstName)
Mailer("Some address")
}
).lastName
}

这种模式具体用在什么场景下呢?再让我想想。。