个人学习总结,留着备用,如果有不对的地方请各位指教,谢谢!
适配器模式
适配器模式把一个类的接口变成客户端所需要的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能够一起工作。
适配器Adapter的作用就是将“源”与“目标”进行匹配。举一个形象的例子,比如我最近想换工作,那么我自己本身就是一个“源”Adaptee,自身拥有的技能就是JAVA和Android,而恰巧钟意的工作相当于“目标”Target,岗位要求处了这两项技能外,还需要了解Hadoop。此时,如果去面试就显得尴尬了。好了,问题来了,如何让我拥有Hadoop技能顺利通过面试呢,也就是说如果实现从“源”到“目标”的匹配。那么问题的关键就明显了,如何添加一个熟悉Hadoop的方法,也许你会讲,直接在“源”中添加Hadoop不就解决完事了么? 当然,如果“源”具备此功能的话,也就不需要什么适配器模式了,对吧!
我的理解,适配器是为了实现某种目的为一个“源”类暂时性添加某种方法,不应破坏源类的结构,如果日后出现新的需求,则又改“源类”这样不符合JAVA高内聚,低耦合的原理。
适配器结构
适配器有类适配器模式和对象适配器两个不同表达形式。
类适配器模式
模块所涉及的角色:
1、目标角色Target:所期待的接口,就像上面例子中钟意的工作;
2、源角色Adaptee:需要适配的接口,就像上面例子中的我;
3、适配器Adapter角色:将“源”匹配到“目标”的具体类;
源代码:
package com.niuxl; /** * 源角色 * @author KATA-pc * */ public class Adaptee { public void Java(){ //具体实现 } ; public void Android(){ //具体实现 } ; }
源类是个具体类,实现了两个方法;
package com.niuxl; /** * 目标接口 * @author KATA-pc * */ public interface Target { public void Java() ; public void Android() ; public void Hadoop() ; }
目标角色定义为接口,声明了三个方法;
package com.niuxl; /** * 适配器角色 * @author KATA-pc * */ public class Adapter extends Adaptee implements Target { @Override public void Hadoop() { // TODO Auto-generated method stub // 具体实现 } }
简而言之:类适配器模式为单一类实现适配才采用的模式。想必看完代码,就清晰很多了,为什么叫做其为类适配器模式?Adapter类继承了Adaptee类,在JAVA语言中继承存在单一性,其不能再去继承其他类,这样的适配器只能为Adaptee类服务,同时实现Target接口,覆写其另一个方法即可满足目标接口要求。
对象适配器模式:
与类适配器模式一样,同样是将“源”到“目标”进行匹配,区别在与不在使用继承管理,采用委派关系将Apdatee类组合到Adapter类中。
源代码:
因目标接口和源类不变,采用上面即可,只贴出对象适配器对应代码:
package com.niuxl; /** * 对象适配器 * @author KATA-pc * */ public class AdapterObj { Adaptee adaptee ; public AdapterObj(Adaptee adaptee){ this.adaptee = adaptee ; } public void Java(){ this.adaptee.Java(); } public void Android(){}{ this.adaptee.Android(); } // 新增方法匹配目标接口 public void Hadoop(){ //具体操作 } }
两个方式区别:
1、类适配器采用对象继承方式,是静态的定义方式;而对象适配器使用对象组合方式,是动态组合方式;
2、对于类适配器,类适配器可以去重定义Adaptee的部分方法,因子类可以覆盖父类部分相关实现方法;而对象适配器要重定义Adaptee行为比较困难,需要定义Adaptee的子类来实现方法覆写。
3、类的适配模式用于单一源的适配,由于它的源的单一话,代码实现不用写选择逻辑,很清晰;而对象的适配模式则可用于多源的适配,弥补了类适配模式的不足,使得原本用类适配模式需要写很多适配器的情况不复存在,弱点是,由于源的数目可以较多,所以具体的实现条件选择分支比较多,不太清晰。
适配器模式主要用于几种情况:(1)系统需要使用现有的类,但现有的类不完全符合需要。(2)讲彼此没有太大关联的类引进来一起完成某项工作(指对象适配)。