读书频道 > 网站 > 网页设计 > Java设计模式(第2版)
类与对象适配器
12-08-27    叶孤城
收藏    我要投稿   

本文所属图书 > Java设计模式(第2版)

本书通过一个完整的Java项目对经典著作Design Patterns一书介绍的23种设计模式进行了深入分析与讲解,实践性强,却又不失对模式本质的探讨。本书创造性地将这些模式分为5大类别,以充分展现各个模式的重要特征,...立即去当当网订购
图3.1与图3.3的设计属于类的适配器,通过子类进行适配。在类的适配器中,新的适配类实现了需要的接口,并继承自现有的类。当你需要适配的一组方法并非被定义在接口中时,这种方式就不奏效了。此时就可以创建一个对象适配器,它使用了委派而非继承。图3.4展现了这样的设计(可以对比之前的类图)。



图3.4  通过继承你所需要的类,可以创建一个对象适配器,利用现有类的实例对象,满足所需方法
图3.4中的NewClass类是适配器的一个例子。该类的实例同时也是RequiredClass类的实例。换言之,NewClass类满足了客户端的需要。NewClass类通过使用ExistingClass实例对象,可以将ExistingClass类适配为符合客户端的需要。

一个更为具体的例子是仿真程序包,它直接与Skyrocket类协作,而没有指定接口去定义仿真系统需要的行为。图3.5展示了该类的设计。

Skyrocket类使用了火箭的基本模型。例如,类假设火箭要在燃料烧尽之后才会坠毁。假设你希望添加一些更为复杂的物理模型,而该模型由Oozinoz系统中的PhysicalRocket类使用。为了适配PhysicalRocket类以满足仿真系统,需要创建OozinozSkyrocket类作为对象适配器,它继承自Skyrocket,同时使用了PhysicalRocket对象,如图3.6所示。



图3.5  在这个替代设计中,com.oozinoz.simulation包并没有指定对火箭进行建模所需的接口





图3.6  完成该类图使其能够体现对象适配器的设计,将现有的类转换,以满足拥有Skyrocket
对象的客户端需求
 
作为一个对象适配器,OozinozSkyrocket类继承自Skyrocket,而非PhysicalRocket。当仿真程序客户端需要Skyrocket对象时,可以令OozinozSkyrocket对象代替它。通过让simTime变量成为受保护的,Skyrocket类就能够支持它的子类化。
挑战3.3
完成图3.6所示的类图,使得OozinozRocket对象支持Skyrocket对象。
答案参见第300页
OozinozSkyrocket类的代码如下所示:
Packagecom.oozinoz.firework;
Importcom.oozinoz.simulation.*;
 
public class OozinozSkyrocket extends Skyrocket {
   privatePhysicalRocket rocket;
   publicOozinozSkyrocket(PhysicalRocket r) {
       super(
           r.getMass(0),
           r.getThrust(0),
           r.getBurnTime());
       rocket = r;
   }
 
   public double getMass() {
       returnrocket.getMass(simTime);
   }
 
   public double getThrust() {
       returnrocket.getThrust(simTime);
   }
}

OozinozSkyrocket类可以为需要Skyrocket对象的仿真程序包提供OozinozSkyrocket类型的对象。总体而言,对象适配器在一定程度上解决了这一问题,即将对象适配为没有明确定义的接口。

与实现RocketSim接口相比,运用了对象适配器的Skyrocket类存在更大的风险。但我们却不应该吹毛求疵,因为它仅仅是没有将方法标记为final,使得我们不能防止子类去重写它们。

挑战3.4
分析为何OozinozSkyrocket类使用的对象适配器设计要比类的适配器方式更加脆弱。
答案参见第301页
点击复制链接 与好友分享!回本站首页
分享到: 更多
您对本文章有什么意见或着疑问吗?请到论坛讨论您的关注和建议是我们前行的参考和动力  
上一篇:1.3 功能
下一篇:1.5 小结
相关文章
图文推荐
JavaScript网页动画设
1.9 响应式
1.8 登陆页式
1.7 主题式
排行
热门
文章
下载
读书

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训
版权所有: 红黑联盟--致力于做最好的IT技术学习网站