用Adapter模式取代部分实现的接口.pdfVIP

  1. 1、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
用Adapter模式取代部分实现的接口 撰文/Joshua Kerievsky 编译/透明 你的类实现一个接口,但是只为接口中的一部分方法提供代码。 将实现的方法移交给该接口的适配器,并让一个工厂方法可以访问该适配器。 动机 具体类中的空方法总是让我很烦心。我经常看见一些空方法,因为具体类经常需要通过实 现某个接口来满足某种要求,但又不是真的需要实现接口中所有的方法。不需要的方法得 到了声明,但是保留为空:添加它们仅仅是为了满足编译器的规则。这可能不会让你烦心, 但的确让我很烦心。我发现,类的接口(即public 方法集合)中如果出现空方法,不但会使 类的接口变得臃肿,还会对类的行为做出错误的宣传(我是一个类,我可以做X() 、Y()和 Z()——但我其实只提供X() 的代码),而且强迫我做一些不想做的工作(比如声明一些空方 法)。 Adapter 模式提供了一种重构这种代码的好方法。Adapter 类将给接口中所有的方法一个空的实 现,而你则可以从Adapter 类派生出需要的子类,同时只需要提供需要的代码。在Java 中,我 甚至不需要正式声明一个Adapter 子类:我只需要在Adapter 类中创建一个匿名子类,然后直接 将它的引用提供给Factory Method 就行了。 通信 重复 简化 不管是有人忘了删掉空方法还是因 如果你有不止一个类部分实现了同 提供少量代码总比提供大量代码要 为接口强迫你保留空方法,类中的 一个接口,那么你可能拥有相当多 容易。这个重构方法给你一种方法 空方法都不会有太多的通信。最好 的空方法了。只要让这些类都与一 以减少类中声明的方法数量。另外, 是只在真正实现的时候才进行通 个处理空方法声明的Adapter类协 当你用这种方法来适配多个接口 信,而Adapter可以帮助你实现这一 同工作,你就可以去掉这些重复。 时,它可以提供一条非常好的途径, 点。 让你可以实现每个接口中的一部分 方法。 技巧 1. 如果还没有要使用的接口(我把它叫做A )的适配器,就用“适配接口”的方法来 创建一个。然后创建一个Factory Method模式,让它返回你的适配器的一个实例(我 把它叫做AdapterInstance )。 2. 把你的类中那些完全因为实现A接口才存在的空方法删掉。 3. 把你实现了的那些由A指定的方法转移到AdapterInstance中。 4. 删除你的类中“implements A”的声明。 5. 把AdapterInstance提供给需要的客户。 示例 我将用具体的代码来说明上面的步骤。在这里我们有一个名叫CardComponent 的类,它派生 自JDK 中的Component类,并实现JDK 中的MouseMotionListener接口。但是,它只实现 MouseMotionListener接口的两个方法中的一个。让我们看看Adapter 模式怎样改善这段代码。 第一步,为我们的AdapterInstance创建一个Factory Method 。如果我们还没有AdapterInstance , 我们就需要用“适配接口”的重构方法来创建一个。在这里,JDK 已经为MouseMotionListener 接口提供了一个适配器,名叫MouseMotionAdapter 。所以我们在CardComponet类中创建下 列新方法,其中使用了Java便利的内部类能力: private MouseMotionAdapter createMouseMotionAdapter() { return new MouseMotionAdapter() { }; } 接着,我们删掉CardComponent 中声明的空方法,因为它在MouseMotionListener 已经被实现 了。在这里,MouseMotionListener实现了mouseDragged方法,但没有实现mouseMoved 方法。 public void mouseMoved(MouseEvent

您可能关注的文档

文档评论(0)

1243595614 + 关注
实名认证
文档贡献者

文档有任何问题,请私信留言,会第一时间解决。

版权声明书
用户编号:7043023136000000

1亿VIP精品文档

相关文档