[把你的理性思维慢慢变成条件反射]
本文,我们讲介绍适配器模式,文章主题结构与上文一致。惯例,先来看看我们示例工程的环境:
操作系统:win7 x64
其他软件:eclipse mars,jdk7
-------------------------------------------------------------------------------------------------------------------------------------
经典问题:
多数据源选择,多组件适配。跨系统对接。(如,电源适配器等)
思路分析:
要点一:一个组件对象能通过一个适配接口使用多个组件功能。
要点二:接口转换,仅转换形式,不改变功能。
示例工程:
标准写法:
创建Target.java文件,具体内容如下:
package com.yonyou.iuap.gof_Adapter;
public class Target {
public void request(){
System.out.println("regular request");
}
}
创建Adapter.java文件,具体内容如下:
package com.yonyou.iuap.gof_Adapter;
public class Adapter extends Target {
private Adaptee adaptee = new Adaptee();
public void request() {
adaptee.specificRequest();
}
}
创建Adaptee.java文件,具体内容如下:
package com.yonyou.iuap.gof_Adapter;
public class Adaptee {
public void specificRequest(){
System.out.println("specific request");
}
}
创建Window.java文件,具体内容如下:
package com.yonyou.iuap.gof_Adapter;
public class Window {
public static void main(String[] args) {
Target target = new Adapter();
target.request();
}
}
模式总结:
适配器模式结构图:
适配器模式:将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的哪些类可以一起工作。((以下内容摘自其他博文)根据对象适配器模式结构图,在对象适配器中,客户端需要调用request()方法,而适配者类Adaptee没有该方法,但是它所提供的specificRequest()方法却是客户端所需要的。为了使客户端能够使用适配者类,需要提供一个包装类Adapter,即适配器类。这个包装类包装了一个适配者的实例,从而将客户端与适配者衔接起来,在适配器的request()方法中调用适配者的specificRequest()方法。因为适配器类与适配者类是关联关系(也可称之为委派关系),所以这种适配器模式称为对象适配器模式。)
组成部分:Target(目标抽象类),Adapter(适配器类),Adaptee(适配者类)。
一般用法:
创建Target.java文件,具体内容如下:
public interface Target {
public void requestA();
public void requestB();
}
创建Adapter.java文件,具体内容如下:
package com.yonyou.iuap.gof_Adapter.one;
public class Adapter implements Target {
private AdapteeFunctionA adapteeA;
private AdapteeFunctionB adapteeB;
public Adapter() {
adapteeA = new AdapteeFunctionA();
adapteeB = new AdapteeFunctionB();
}
public void requestA() {
adapteeA.specificRequestA();
}
public void requestB() {
adapteeB.specificRequestB();
}
}
创建AdapteeFunctionA.java,AdapteeFunctionB.java文件,具体内容如下:
public class AdapteeFunctionA {
public void specificRequestA(){
System.out.println("specific request A");
}
}
创建Window.java文件,具体内容如下:
public class Window {
public static void main(String[] args) {
Target target = new Adapter();
target.requestA();
target.requestB();
}
}
在一般写法中,常见的用法是,客户端使用的Target中能够看到所有的方法,而这些具体的方法,可能分散到各个具体的实现类当中。另外,对于客户端而言,如何选择一个具体的实现类,通常情况下是由是配置文件+反射进行灵活配置(常见的如,数据源驱动选择)。
模式扩展:缺省适配器(内容摘自其他博文)
概念:缺省适配器模式(Default Adapter Pattern):当不需要实现一个接口所提供的所有方法时,可先设计一个抽象类实现该接口,并为接口中每个方法提供一个默认实现(空方法),那么该抽象类的子类可以选择性地覆盖父类的某些方法来实现需求,它适用于不想使用一个接口中的所有方法的情况,又称为单接口适配器模式。
组成部分:ServiceInterface(适配者接口,声明了大量的方法),AbstractServiceClass(缺省适配器类,实现了在ServiceInterface接口中声明的所有方法,但均为空实现),ConcraeteServiceClass(具体业务类,选择性地覆盖在适配器类中定义的方法)。
反思:
应用场景:
- 新系统或组件需要使用一些旧的现有的系统或组件,这些系统或组件由于系统结构的异构性无法直接使用时。
- 双方存在各自的开发,维护,扩展体系时。
优点:
- 将客户端与服务提供方关系有效解耦,减少了两端改动迁移的成本。
- 增加了调用关系的透明性和代码的复用度。
- 有效的方便了后续的开发,维护,扩展。
缺点:
- 在同一功能需求下,只能存在一个适配器,即当需要适配的功能过多时,可能导致适配器类功能复杂冗余。
- 如果需要修改适配器,需要修改适配器类,适配者类等,具体实现步骤可能较多。
-------------------------------------------------------------------------------------------------------------------------------------
至此,被说了很多遍的设计模式---适配器模式 结束
在实际开发中,适配器模式是一个较为常用的设计模式,上文从简到难逐步解释了适配器的应用过程,望各位看官多加练习,参考其他优秀设计实现过程,熟练掌握此模式。
参考资料:
图书:《大话设计模式》
其他博文:http://blog.csdn.NET/lovelion/article/details/7563445