设计模式之适配器模式

来源:互联网 发布:手机淘宝网软件下载 编辑:程序博客网 时间:2024/05/01 13:49

个人理解:当客户需要某个功能时,第三方类已存在具体实现,我们只需要把该实现融合到我们提供给客户的接口中即可,而这一融合的方式就是适配器模式啦。

官方描述:把原有接口改造为客户端需要的接口,使不能兼容使用的两个类能一起工作


 适配器模式可分为类适配器和对象适配器两种模式,

·对象适配器模式 - 在这种适配器模式中,适配器容纳一个它我包裹的类的实例。在这种情况下,适配器调用被包裹对象的物理实体。

·类适配器模式 - 这种适配器模式下,适配器继承自已实现的类(一般多重继承)。


 ----- 类适配器模式----

这个图有误,应该是继承Adaptee,实现Target,可惜家里没有visio,改天再画咯

 

这种适配器模式下,适配器继承自已实现的类(一般多重继承)实现被适配者接口。


----- 对象适配器模式----

 

-- 在这种适配器模式中,适配器容纳一个它包裹的类的实例。在这种情况下,适配器调用被包裹对象的物理实体。


对象的适配器模式的效果:

         1.一个适配器可以把多种不同的源适配到同一个目标,换言之,同一个适配器可以把源类和它的子类都适配到目标接口。

         2.与类的适配器模式相比,要想置换源类的方法不容易。(如果面向接口编程就方便了,通过set不同的源类即可解决这个问题)

         3.虽然想置换源类的方法不容易,但是添加新方法容易,且适用于所有的源。


总结:类适配器通过继承来获取适配类(原)的功能的,对象适配器而是通过适配类的对象来获取的,这就解决了java不能多继承所带来的不便了。这也是java提倡的编程思想之一,即尽量使用聚合不要使用继承。 项目中还是推荐使用对象适配器。


最后附上自己的实例:

业务场景一:业务方要求我们提供个获取客户相关信息的功能,给开发方定义了接口ClassTarget如下

package adapter;/** * 该接口要求实现获取客户信息的接口 * @author Administrator * */public interface ClassTarget {String getCustomer();}

开发方发现之前该功能接口已存在具体实现了

package adapter;public class Customer {public String getCustomer(){return "customer";}}
那我们可以通过通过继承把已有实现融合进现有接口实现中,从而避免了重复开发工作,这就是类适配器模式

package adapter;/** * 类适配器 * 定义一个接口,要求能获取客户信息 * @author Administrator * */public class ClassAdapter extends Customer implements ClassTarget {public String getCustomer() {// TODO Auto-generated method stubreturn super.getCustomer();}}
业务场景二:业务方胃口大了,除了客户的基本信息, 他还想要客户的机构信息和卡片信息, 给开发方定义了下述接口
package adapter;/** * 该接口要求提供获取客户信息、机构信息、卡片信息的功能 * @author Administrator * */public interface ObjectTarget {String getCustomer();String getOrg();String getCard();}
开发方发现这三个功能接口都有具体实现,但问题是这三个实现并不在同一个类中,再用继承的方式搞不定这个问题(java不允许多重继承)

package adapter;public class Card {public String getCard(){return "card";}}

package adapter;public class Org {public String getOrg(){return "org";}}


package adapter;public class Customer {public String getCustomer(){return "customer";}}

这个时候就是对象适配器模式发挥的时候了,我们可以通过包裹类的实例来调用具体的api实现对应的业务功能


package adapter;/** * 对象适配器 * 通过获取各个对象的物理实体,然后调用具体api实现接口功能 * 提供获取客户信息、机构信息、卡片信息的功能 * @author Administrator * */public class ObjectAdapter implements ObjectTarget{private Customer customer;private Card card;private Org org;public void setCustomer(Customer customer) {this.customer = customer;}public void setCard(Card card) {this.card = card;}public void setOrg(Org org) {this.org = org;}public String getCard() {// TODO Auto-generated method stubreturn card.getCard();}public String getCustomer() {// TODO Auto-generated method stubreturn customer.getCustomer();}public String getOrg() {// TODO Auto-generated method stubreturn org.getOrg();}}





原创粉丝点击