首页 > 代码库 > 每天一个设计模式-3 适配器模式(Adapteer)

每天一个设计模式-3 适配器模式(Adapteer)

每天一个设计模式-3 适配器模式(Adapteer)

1.现实中的情况

旧式电脑的硬盘是串口的,直接与硬盘连接,新硬盘是并口的,显然新硬盘不能直接连在电脑上,于是就有了转接线。好了,今天的学习主题出来了“适配器”。

技术分享

2.联系编程

有一个电源类,一个旧的硬盘类,还有一个新硬盘类;电源类能直接适配旧硬盘类,但不能和新硬盘适配。

这时,可以添加一个适配器类,这里采用对象引用的方式实现适配器。

3.类图

模式简图:

技术分享

测试时使用的类图:

技术分享

4.代码

NewDiskApi:

技术分享
public interface NewDiskApi {    public void InstallNewDisk();}
NewDiskApi

NewDisk:

技术分享
public class NewDisk implements NewDiskApi {    public NewDisk(){    }    public void finalize() throws Throwable {    }    public void InstallNewDisk(){        System.out.println("安装新磁盘");    }}
NewDisk

OldDiskApi:

技术分享
public interface OldDiskApi {    public void InstallthisDisk();}
OldDiskApi

OldDisk:

技术分享
public class OldDisk implements Computer {    public OldDisk(){    }    public void finalize() throws Throwable {    }    public void installDisk(){        System.out.println("安装旧磁盘");    }}
OldDisk

Adapter:

技术分享
public class Adapter implements Computer {    private NewDiskApi newDiskApi;    public Adapter(NewDiskApi newDiskApi){        this.newDiskApi = newDiskApi;        System.out.println("因为不支持新磁盘,所以使用了"+this.getClass().getName());    }    public void finalize() throws Throwable {    }    public void installDisk(){        newDiskApi.InstallNewDisk();    }}
Adapter

Client:

技术分享
public class Client {    public Client(){    }    public void finalize() throws Throwable {    }    public static void main(String[] args){        Computer oldDisk = new OldDisk();        oldDisk.installDisk();        Computer newDisk = new Adapter(new NewDisk());        newDisk.installDisk();    }}
Client

 

测试结果:

安装旧磁盘
因为不支持新磁盘,所以使用了Adapter
安装新磁盘

5.模式讲解

适配器模式的主要功能就是转换匹配,复用已有功能,但并不是说,在适配器里面就不能实现其他功能,相反,适配器里面可以将多个模块的方法组合来完成一个功能,称这种适配器为智能适配器。

适配器模式可以被实现主要是通过对象引用(Adaptee在这里指的是newDiskApi)方式使不兼容的接口兼容(通过Adapter).

还有一种适配方式是缺省适配:

    为一个接口提供缺省实现。然后通过继承这个缺省对象,让子类有选择的覆盖实现需要用的方法。

注意:使用适配器模式有一个潜在的问题,就是被适配的对象(就是被Adapter适配的newDiskApi)不再兼容Adaptee的接口,因为适配器只实现了Target(在这里就是上面的Computer,如果Adapter也实现了newDiskApi就不存在这样的问题了).这导致并不是所有Adaptee对象可以被使用的地方都能使用适配器。

双向适配器:

双向适配器就是适配器类分别实现了不同的Adateee(联系例子指的就是newDisk),并通过对象引用不同的Adaptee,此时的适配器可以同时当作Target和Adapter来使用,下面使用类图来表示也许更好理解一点:

技术分享

6.适配器模式的优缺点

优点:

更好的复用性:如果功能已经被实现,只是接口不兼容,可以通过适配器模式解决。更好的可扩展性:实现适配器功能时,也可以调用自己开发的功能,从而很自然的扩展系统。

缺点:

过多使用适配器模式,可能会使系统变得非常混乱,不容易整体把握。

7.总结

转换匹配,复用功能适配器里面引用的对象是实现的核心,在适配器内部调用不兼容的接口对象,屏蔽了不兼容接口对象与Target的直接交互,所以达到了适配的目的。

 

 

 

 

 

 

 

添加到反广告列表

每天一个设计模式-3 适配器模式(Adapteer)