演化架构与紧急设计: 语言、表达性与设计 - 第2部分 - 编程入门网
dius()
}
class SquarePeg {
def width
}
class RoundPeg {
def radius
}
class RoundHole {
def radius
def pegFits(peg) {
peg.radius <= radius
}
String toString() { "RoundHole with radius $radius" }
}
传统的适配器实现将创建一个 SquarePegAdaptor 类,它封装了方形木条并实现了 RoundHole 的 pegFits() 方法所所需的 getRadius() 方法。但是,Groovy 允许我绕过额外类的结构,以内联的方式直 接定义适配,如清单 10 所示: 清单 10. 测试内联适配器
适配器定义看上去有些奇怪,但它封装了大量功能。我将 adaptor 定义为一个代码块(使用 Groovy 中的 { 界定)。在代码块内部,我创建了一个散列,其键是某个属性的名称(getRadius()),而值是实 现了适配器所需功能的代码块。Groovy 中的 as 运算符完成的神奇的工作。当我对某代码块执行 as 运 算符时,Groovy 将创建一个实现了 RoundThing 接口的新类;对该类的方法调用将在散列中执行查找操 作,将方法名与键值匹配,并执行相应的代码块。最终的结果是一个高度轻量级的适配器类,它实现了 RoundThing 接口所需的功能。 虽然最终的类级实现与传统方法相同,但其代码(如果您了解 Groovy)更易于阅读和理解。仅在这种 情况下,Groovy 允许您围绕接口创建轻量级的包装器类。 演化架构与紧急设计: 语言、表达性与设计 - 第2部分(7)时间:2011-08-18 IBM Neal FordJRuby 中的适配器模式 如果您完全不愿意为适配器创建额外的类,那么应该怎么办呢?Groovy 和 Ruby 都支持开放开放类, 因此您可以直接在相关类中添加所需的方法。Ruby 中的方形木条和圆孔实现(通过 JRuby)如清单 11 所示: 清单 11. Ruby 中的开放类适配器
演化架构与紧急设计: 语言、表达性与设计 - 第2部分(8)时间:2011-08-18 IBM Neal Ford清单 11 中的第二个 SquarePeg 类定义并没有错:Ruby 的开放类语法看上去类似于普通的定定义。 在使用某个类名时,Ruby 会检查是否已经从类路径中加载了相同名称的类,如果是,则会在第二次操作 时重新打开这个类。当然,在本例中,我可以将 radius() 方法直接添加到类中,但我假定原始的 SquarePeg 类在此代码之前定义。清单 12 显示了开放类适配器的单元测试: 清单 12. 测试开放类适配器
|
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |