码迷,mamicode.com
首页 > 编程语言 > 详细

JAVA设计模式(DESIGN PATTERNS IN JAVA)读书摘要 第1部分接口型模式——第3章 适配器(Adapter)模式

时间:2016-01-11 23:55:05      阅读:379      评论:0      收藏:0      [点我收藏+]

标签:

客户端代码提供接口来写具体实现类时,要利用已经实现接口功能的现有类,但是接口的方法名和现有类的方法名不一致,则需要使用适配器模式。

接口适配

如图所示,

技术分享

RequiredInterface接口声明了Client类所要调用的requiredMethod()方法,ExistingClass的usefulMethod()提供了此方法的具体实现,但是这两个方法的名字不同,这要对ExistingClass进行适配。适配类NewClass继承ExistingClass类,实现了RequiredInterface接口。上图的NewClass就是适配器模式的一个实例。

下面进行更具体的说明。

假定我们为Oozinoz公司开发仿真火箭的飞行和控制程序。在Oozinoz公司中,已经有了一个事件仿真器接口。如下图,

技术分享

而在Oozinoz公司,PhysicalRocket类实现了仿真所需的功能行为,我们要将它放到仿真功能中去,此时,就可以运用适配者模式,创建PhysicalRocket的子类,并同时实现RocketSim接口。如下图,

技术分享

图中RocketSim就是客户端提供的接口,PhysicalRocket实现了接口所需的方法,OozinozRocket继承自PhysicalRocket,实现了RocketSim,它提供的功能满足了客户端的需求。

当客户端在接口中定义了它所期待的行为时,就可以运用适配器模式,提供一个实现该接口的类,并让该类继承自现有的提供了接口方法功能的类。

类与对象适配器

上述的适配器是类的适配器,但是如果客户端提供给我们一个类,而不是接口,那么就要使用另一种适配器,对象适配器。如图,

技术分享

图中的NewClass就是对象适配器的一个例子。它继承了RequiredClass,它的实例就是RequiredClass的实例,同时NewClass通过使用ExistingClass实例对象,将ExistingClass进行适配以符合客户端的需求,所以NewClass满足了客户端的需要。

下面是一个更为具体的例子:

在com.oozinoz.simulation这个仿真程序包中没有提供火箭的接口,但是它提供了具有一般的火箭特征的SkyRocket类。但是,假如现在我们要模拟具有更多复杂功能的的火箭,而这些功能在另外一个现有类PhysicalRocket中提供了。为了适配PhysicalRocket类,我们就需要一个适配器类。如下图,

技术分享

作为一个对象适配器,OozinozSkyRocket类继承自SkyRocket类,而非PhysicalRocket类。当仿真程序客户端需要SkyRocket对象时,可以令OozinozSkyRocket对象代替它。通过让simTime变量成为受保护的,SkyRocket类就能够支持它的子类化。

JTabel对数据的适配

在表中显示数据时,通常会运用对象适配器。Swing提供了JTable控件用以显示表。JTable不知道我们要显示的数据是什么,它定义了一个TabelModel接口,同时还给我们一个实现部分TableModel接口方法的类AbstractTableModel。这两个类的设计如图所示,

技术分享

假设需要使用Swing的用户界面在表中显示几个火箭。如下图所示,可以创建RocketTableModel类将这组火箭适配为TableModel所期待的接口。

技术分享

在这里我们使用对象适配器模式的原因是因为抽象类提供了适配器需要的部分实现,同时拥有客户端期待的接口,那么我们就要从抽象类继承,而不是实现接口,而适配器对象会拥有多个Rocket对象,所以我们也必须使用组合的方式,而不是继承。

总结:类的适配器继承自现有的类,同时实现目标接口;对象适配器继承自目标类,同时引用现有的类。

小结

适配器模式使我们可以重用一个现有的类,以满足客户端的需求。

如果客户端以接口来表达其需求时,就使用类的适配器;如果客户端不是用接口来表示其需求,就要使用对象适配器,或者适配器对象要持有多个现有类的实例时,也要使用对象适配器。

 

JAVA设计模式(DESIGN PATTERNS IN JAVA)读书摘要 第1部分接口型模式——第3章 适配器(Adapter)模式

标签:

原文地址:http://www.cnblogs.com/free-happy-coding/p/5117720.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!