Java设计模式之适配器模式Adapter(结构型)

来源:互联网 发布:涂鸦制作软件 编辑:程序博客网 时间:2024/05/16 05:48

第一次见到适配器模式的时候,很佩服为设计模式命名的人,因为他们真的很符合这个名字,做到了见名知意;

概述:

在我们的开发中业务会经常的变化,接口也会做出相应的改变,而这些又是我们不得不去面对的事情,这个时候我们可以用到适配器这个模式,他将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原本由于不兼容而不能一起工作的哪些类可以一起工作;

适配器角色:

目标接口(Target):客户所期待的接口。目标可以是具体的或抽象的类,也可以是接口。

需要适配的类(Adaptee):需要适配的类或适配者类。

适配器(Adapter):通过包装一个需要适配的对象,把原接口转换成目标接口。

适配器的经典实现:

适配器是英语Adapter/adaptor的汉语翻译。适配器就是一个接口转换器,它可以是一个独立的硬件接口设备,允许硬件或电子接口与其它硬件或电子接口相连,也可以是信息接口。比如:电源适配器、三角架基座转接部件、USB与串口的转接设备等。

结构

类适配器使用多重继承对一个接口与另一个接口进行匹配,如下图所示:


对象匹配器依赖于对象组合,如下图所示:


实例:



假设我们最开始设计了一个安卓的充电器,后来我们想让这个接口也可以满足Iphone充电器怎么办啦

针对这样的兼容性决办法就是创建一个适配器(Adapter)。

类适配器使用的是继承

/**  * 类适配器模式  * @author lyg *   */     /**  * 目标角色  * @version 2.0  */  interface Target {  /*/ * 充电器接口 */    public void charger(String type);     }/**  * 源角色:被适配的角色  * @version 2.0  */ class Adaptee{public void PhoneCharger(){System.out.println("我是一个iphone充电器");}}/**  * 类适配器角色  */  class Adapter extends Adaptee implements Target{@Overridepublic void charger(String type) {if("android".equals(type)){System.out.println("我是一个安卓充电器");}if("Iphone".equals(type)){PhoneCharger();}}}
public class Test {/*/ * main方法,模拟客户端调用 */public static void main(String[] args) {Adapter adapter=new Adapter();adapter.charger("Iphone");}}

这样以后,以后如果程序再变动,我们也可以只需要增加适配器角色就可以满足需求;

对象适配器使用的是委派:

/**  * 类适配器模式  * @author lyg *   */     /**  * 目标角色  * @version 2.0  */  interface Target {  /*/ * 充电器接口 */    public void charger(String type);     }/**  * 源角色:被适配的角色  * @version 2.0  */ class Adaptee{public void PhoneCharger(){System.out.println("我是一个iphone充电器");}}/**  * 类适配器角色  */  class Adapter  implements Target{public Adaptee adaptee;@Overridepublic void charger(String type) {if("android".equals(type)){System.out.println("我是一个安卓充电器");}if("Iphone".equals(type)){adaptee.PhoneCharger();}}public Adapter(Adaptee adaptee) {super();this.adaptee = adaptee;}

public class Test {/*/ * main方法,模拟客户端调用 */public static void main(String[] args) {Adaptee adaptee=new Adaptee();Adapter adapter=new Adapter(adaptee);adapter.charger("Iphone");}}

如例中代码所示,你可以运用适配器(Adapter)模式来避免因外部库改变所带来的不便——倘若向上兼容。作为某个库的开发者,你应该独立编写适配器,使你的用户更简便地使用新版本的库,而不用去修改他们现有的全部代码。

     GoF书中提出的适配器(Adapter)模式更倾向于运用继承而不是组成。这在强类型语言中是有利的,因为适配器(Adapter)事实上是一个目标类的子类,因而能更好地与类中方法相结合。

模式总结

   优点

    1 通过适配器,客户端可以调用同一接口,因而对客户端来说是透明的。这样做更简单、更直接、更紧凑。

    2 复用了现存的类,解决了现存类和复用环境要求不一致的问题。

    3 将目标类和适配者类解耦,通过引入一个适配器类重用现有的适配者类,而无需修改原有代码。

    4 一个对象适配器可以把多个不同的适配者类适配到同一个目标,也就是说,同一个适配器可以把适配者类和它的子类都适配到目标接口。

  2 缺点

    对于对象适配器来说,更换适配器的实现过程比较复杂。

  3 适用场景

    3.1 系统需要使用现有的类,而这些类的接口不符合系统的接口。

    3.2 想要建立一个可以重用的类,用于与一些彼此之间没有太大关联的一些类,包括一些可能在将来引进的类一起工作。

    3.3 两个类所做的事情相同或相似,但是具有不同接口的时候。

    3.4 旧的系统开发的类已经实现了一些功能,但是客户端却只能以另外接口的形式访问,但我们不希望手动更改原有类的时候。

    3.5 使用第三方组件,组件接口定义和自己定义的不同,不希望修改自己的接口,但是要使用第三方组件接口的功能。

适配器应用举例

  1 使用过ADO.NET的开发人员应该都用过DataAdapter,它就是用作DataSet和数据源之间的适配器。DataAdapter通过映射Fill和Update来提供这一适配器。

  2 手机电源适配器



1 0