快速业务通道

演化架构与紧急设计: 语言、表达性与设计 - 第2部分 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-15
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. 测试内联适配器

@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 允许您围绕接口创建轻量级的包装器类。

演化架构与紧急设计: 语言、表达性与设计 - 第2部分(7)

时间:2011-08-18 IBM Neal Ford

JRuby 中的适配器模式

如果您完全不愿意为适配器创建额外的类,那么应该怎么办呢?Groovy 和 Ruby 都支持开放开放类, 因此您可以直接在相关类中添加所需的方法。Ruby 中的方形木条和圆孔实现(通过 JRuby)如清单 11 所示:

清单 11. Ruby 中的开放类适配器

class SquarePeg   attr_reader :width   def initialize(width)    @width = width   end end class SquarePeg   def radius    Math.sqrt(((@width/2) ** 2) * 2 )   end end class RoundPeg   attr_reader :radius   def initialize(radius)     @radius = radius   end   def width    @radius * @radius   end end class RoundHole   attr_reader :radius   def initialize(r)    @radius = r   end   def peg_fits?( peg )    peg.radius <= radius   end end

演化架构与紧急设计: 语言、表达性与设计 - 第2部分(8)

时间:2011-08-18 IBM Neal Ford

清单 11 中的第二个 SquarePeg 类定义并没有错:Ruby 的开放类语法看上去类似于普通的定定义。 在使用某个类名时,Ruby 会检查是否已经从类路径中加载了相同名称的类,如果是,则会在第二次操作 时重新打开这个类。当然,在本例中,我可以将 radius() 方法直接添加到类中,但我假定原始的 SquarePeg 类在此代码之前定义。清单 12 显示了开放类适配器的单元测试:

清单 12. 测试开放类适配器

def test_open_class_pegs   hole = RoundHole.new( 4.0 )   4.upto(7) do |i|    peg = SquarePeg.new(i.to_f)    if (i < 6)     assert hole.peg_fits?(

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号