java设计模式之Adapter适配器模式


java设计模式之Adapter适配器模式


适配器模式是我们开发中非常常见的一种设计模式,有时候我们可能没有注意到,但是其实无意中用到了这种模式。今天就来详细说明一下什么是适配器模式。

1、什么是适配器模式?

  在实际生活中,可能存在这样一种情况,5年前买了的一个笔记本电脑和一个单独显示器,笔记本和显示器连接都只支持VGA接口,但是显示器突然坏了买了一个显示器,但是这个显示器只支持HDMI接口连接笔记本,怎么和原来的笔记本匹配上呢,又不想再买个笔记本,于是乎我们网购了一个转换接头,将HDMI转为VGA,这个转换接头就是转换器。

  从这个例子中我们可以得出几个关键要素概念:

  (1)目标接口target: 新显示器

  (2)适配器Adapter:转换接头

  (3)被适配者Adaptee 电脑接口  

  设计模式灵感来源于现实世界,解决问题也类似生活中的问题,适配器模式主要是解决不同接口之间适配问题,有一定开闭原则,这解释适配器模式简单定义。

2.适配器模式代码示例

2.1 旧显示器接口和实现

public interface VGAViewInterface {

     void view();

}
public class VGAView implements VGAViewInterface {

    @Override
    public void view() {
        System.out.println("我VGA接口");
    }

}

2.2笔记本的接口实现

public class MyComputer {

    private VGAViewInterface vgaView;

    public MyComputer(){}

    public MyComputer(VGAViewInterface vgaView) {
        this.vgaView = vgaView;
    }

    public void setView (VGAViewInterface vgaView){
        this.vgaView = vgaView;
    }

    public void view() {
        vgaView.view();
    }

}

2.3新显示器接口和实现

public interface HDMIViewInterface {

    void view();

}
public class HDMIView implements HDMIViewInterface{
    @Override
    public void view() {
        System.out.println("我使用转换器将VGA转换为HDMI");
    }
}

2.4适配器的实现

public class ViewAdapter implements VGAViewInterface{


    private HDMIViewInterface hdmiViewInterface;


    public ViewAdapter(HDMIViewInterface hdmiViewInterface) {
        this.hdmiViewInterface = hdmiViewInterface;
    }


    @Override
    public void view() {
        hdmiViewInterface.view();
    }
}

2.5电脑使用旧显示器或者使用适配器连接新显示器

    public static void main(String[] args) {

        VGAViewInterface oldView = new VGAView();


        MyComputer myComputer = new MyComputer(oldView);


        myComputer.view();


        HDMIViewInterface hdmiViewInterface = new HDMIView();

        ViewAdapter newView = new ViewAdapter(hdmiViewInterface);

        myComputer = new MyComputer(newView);

        myComputer.view();
    }

 打印结果如下:

我VGA接口
我使用转换器将VGA转换为HDMI

 上述例子定义了两个显示器接口和实现,定义了一个接口适配器和笔记本电脑的客户端接口实现,画成UML类图如下:

3 总结

该模式的主要优点如下。

  • 客户端通过适配器可以透明地调用目标接口。
  • 复用了现存的类,程序员不需要修改原有代码而重用现有的适配者类。
  • 将目标类和适配者类解耦,解决了目标类和适配者类接口不一致的问题。
  • 在很多业务场景中符合开闭原则。


其缺点是:

  • 适配器编写过程需要结合业务场景全面考虑,可能会增加系统的复杂性。
  • 增加代码阅读难度,降低代码可读性,过多使用适配器会使系统代码变得凌乱。

有人认为讲解设计模式的例子都太简单,看着感觉是那么回事,但是要是真想在项目开发中使用,还真是应用不到。其实我们不必在项目中刻意使用设计模式,而是应该从实际的设计问题出发,看哪个模式能解决我们的问题,就使用哪个模式。不要为了使用模式而使用模式,那样就舍本逐末了,一般情况下,只要遵循一定的设计原则就可以了,设计模式也是根据这些原则被总结出来的,熟悉了这些原则,模式自然而然就有了。