演化架构与紧急设计: 语言、表达性与设计:第 2 部分
2009-11-05 00:00:00 来源:WEB开发网传统的适配器实现将创建一个 SquarePegAdaptor 类,它封装了方形木条并实现了 RoundHole 的 pegFits() 方法所所需的 getRadius() 方法。但是,Groovy 允许我绕过额外类的结构,以内联的方式直接定义适配,如清单 10 所示:
清单 10. 测试内联适配器@Test void pegs_and_holes() {
def adapter = { p ->
[getRadius:{Math.sqrt(
((p.width/2) ** 2)*2)}] as RoundThing
}
def hole = new RoundHole(radius:4.0)
(4..7).each { w ->
def peg = new SquarePeg(width:w)
if (w < 6)
assertTrue hole.pegFits(adapter(peg))
else
assertFalse hole.pegFits(adapter(peg))
}
}
适配器定义看上去有些奇怪,但它封装了大量功能。我将 adaptor 定义为一个代码块(使用 Groovy 中的 { 界定)。在代码块内部,我创建了一个散列,其键是某个属性的名称(getRadius()),而值是实现了适配器所需功能的代码块。Groovy 中的 as 运算符完成的神奇的工作。当我对某代码块执行 as 运算符时,Groovy 将创建一个实现了 RoundThing 接口的新类;对该类的方法调用将在散列中执行查找操作,将方法名与键值匹配,并执行相应的代码块。最终的结果是一个高度轻量级的适配器类,它实现了 RoundThing 接口所需的功能。
虽然最终的类级实现与传统方法相同,但其代码(如果您了解 Groovy)更易于阅读和理解。仅在这种情况下,Groovy 允许您围绕接口创建轻量级的包装器类。
JRuby 中的适配器模式
更多精彩
赞助商链接