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

来源:互联网 发布:淘宝电器销售额 编辑:程序博客网 时间:2024/06/04 20:10

  之前创建型模式已经讲完,本篇开始讲结构型模式。
  结构型模式主要作用是通过组合类和对象从而来获得更大的结构,增加灵活性。

适配器模式:将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。

示例

  博主自己有一台尼康的相机,由于自己的笔记本没有SD卡槽只有USB接口,所以笔记本不能直接读取内存卡,不过幸好买的时候赠送了一个读卡器,问题也就自然解决了。那这里,读卡器作为内存卡和笔记本之间的适配器,只要将内存卡插入读卡器,再讲读卡器插入笔记本,就可以通过笔记本来读取内存卡里面的内容。

三个要素

  1. 目标角色(Target):客户所期待的接口。可以是具体的或者抽象的类,也可以是接口。即示例中笔记本的USB接口。
  2. 源角色(Adaptee):已经存在的需要适配的接口。即示例中SD卡槽。
  3. 适配器(Adapter):适配器将源接口转换成目标接口。只能是具体的类。即示例中的读卡器。

实现方式

  适配器的实现主要有两种方式,一种是采用组合方式的适配器成为对象适配器,另外一种是采用继承方式的适配器称为类适配器。我这里以示例为主来进行讲解。

类适配器

  先创建我们的目标角色,即Usb接口 UsbInterface

public interface UsbInterface {    void usbRead(); }

  接着创建我们的源角色,即SD卡接口 SDInterface

public class SDInterface {    public void sdRead() {        System.out.println("SD接口读取...");    }}

  然后写一个适配器类,即我们的读卡器 CardReader,将SD接口转换成USB接口

public class CardReader extends SDInterface implements UsbInterface {    @Override    public void usbRead() {        super.sdRead();        System.out.println("读卡器转换...");        convert();    }    public void convert() {        System.out.println("USB接口读取...");    }}

  最后写个适配器的测试类 AdapterTest 测试下

public class AdapterTest {    public static void main(String[] args) {        UsbInterface usb = new CardReader();        usb.usbRead();    }}

运行的结果如下:

SD接口读取...读卡器转换...USB接口读取...

  这里我们的适配器类CardReader既继承了被适配类SDInterface,同时也实现了我们的目标角色UsbInterface,因为Java当中不支持多继承,所以我们只能这样来实现。

对象适配器

  对于对象适配器来说,主要修改的还是我们的适配器类CardReader类,至于目标角色UsbInterface和源角色SDInterface并没有做修改。
  下面看下修改的代码:
  读卡器 CardReader,将SD接口转换成USB接口

public class CardReader implements UsbInterface {    private SDInterface sd;    public CardReader(SDInterface sd) {        this.sd = sd;    }    @Override    public void usbRead() {        sd.sdRead();        System.out.println("读卡器转换...");        convert();    }    public void convert() {        System.out.println("USB接口读取...");    }}

  写个适配器的测试类 AdapterTest 测试下

public class AdapterTest {    public static void main(String[] args) {        SDInterface sd = new SDInterface();        UsbInterface usb = new CardReader(sd);        usb.usbRead();    }}

运行的结果如下:

SD接口读取...读卡器转换...USB接口读取...

优点

  1.透明:通过适配器,客户端可以调用同一接口,因而对客户端来说是透明的。这样做更简单、更直接、更紧凑。
  2.重用:复用了现存的类,解决了现存类和复用环境要求不一致的问题
  3.低耦合:将目标类和适配者类解耦,通过引入一个适配器类重用现有的适配者类,而无需修改原有的代码(遵循开闭原则)

阅读全文
0 0