Bootstrap

java设计模式-结构型模式-适配器模式

java设计模式-结构型模式-适配器模式

场景举例

电脑连接显示器

第一种连接方式,有三个设备,hdmi电脑hdmi数据线hdmi显示器

hdmi电脑连接hdmi数据线hdmi数据线连接hdmi显示器,显示器显示内容

第二种连接方式,有四个设备,hdmi电脑hdmi数据线hdmi转vga的转接线vga显示器

hdmi电脑连接hdmi数据线hdmi数据线连接hdmi转vag的转接线hdmi转vga的转接线连接vga显示器,显示器显示内容

在第二种连接方式中,hdmi转vga的转接线就可以理解为是一个适配器,对于hdmi数据线来说,hdmi转vga的转接线hdmi显示器是类似的设备,都是可以连接的,hdmi转vga的转接线被连接之后,再由hdmi转vga的转接线连接vga显示器,从而达到显示器显示内容的效果

第一种连接方式代码示例

hdmi电脑接口
package xin.yangshuai.basic01.gof23.adapter;

public interface HdmiComputer {

    /**
     * hdmi电脑可以连接hdmi数据线
     *
     * @param hdmiCable
     */
    void connect(HdmiToHdmiCable hdmiCable);

    /**
     * 显示内容
     */
    String show();
}
hdmi数据线接口
package xin.yangshuai.basic01.gof23.adapter;

public interface HdmiToHdmiCable {

    /**
     * hdmi数据线可以连接hdmi显示器
     *
     * @param hdmiMonitor
     */
    void connect(HdmiMonitor hdmiMonitor);

    /**
     * 显示内容
     *
     * @return
     */
    String show();
}
hdmi显示器接口
package xin.yangshuai.basic01.gof23.adapter;

public interface HdmiMonitor {

    /**
     * 设置显示内容
     */
    void setShowContent(String showContent);

    /**
     * 显示内容
     */
    String show();
}
hdmi电脑实现类
package xin.yangshuai.basic01.gof23.adapter.impl;

import xin.yangshuai.basic01.gof23.adapter.HdmiComputer;
import xin.yangshuai.basic01.gof23.adapter.HdmiToHdmiCable;

public class MyHdmiComputer implements HdmiComputer {

    private HdmiToHdmiCable hdmiToHdmiCable;

    @Override
    public void connect(HdmiToHdmiCable hdmiToHdmiCable) {
        this.hdmiToHdmiCable = hdmiToHdmiCable;
    }

    @Override
    public String show() {
        System.out.println("通过当前设备:hdmi电脑");
        if (hdmiToHdmiCable != null) {
            return hdmiToHdmiCable.show();
        }
        return null;
    }
}
hdmi数据线实现类
package xin.yangshuai.basic01.gof23.adapter.impl;

import xin.yangshuai.basic01.gof23.adapter.HdmiMonitor;
import xin.yangshuai.basic01.gof23.adapter.HdmiToHdmiCable;

public class MyHdmiToHdmiCable implements HdmiToHdmiCable {

    private HdmiMonitor hdmiMonitor;

    @Override
    public void connect(HdmiMonitor hdmiMonitor) {
        this.hdmiMonitor = hdmiMonitor;
    }

    @Override
    public String show() {
        System.out.println("通过当前设备:hdmi到hdmi数据线");
        if (hdmiMonitor != null) {
            return hdmiMonitor.show();
        }
        return null;
    }
}
hdmi显示器实现类
package xin.yangshuai.basic01.gof23.adapter.impl;

import xin.yangshuai.basic01.gof23.adapter.HdmiMonitor;

public class MyHdmiMonitor implements HdmiMonitor {

    private String showContent;

    @Override
    public void setShowContent(String showContent) {
        this.showContent = showContent;
    }

    @Override
    public String show() {
        System.out.println("通过当前设备:hdmi显示器");
        return showContent;
    }
}
方法调用测试
package xin.yangshuai.basic01.gof23.adapter;

import xin.yangshuai.basic01.gof23.adapter.impl.MyHdmiComputer;
import xin.yangshuai.basic01.gof23.adapter.impl.MyHdmiMonitor;
import xin.yangshuai.basic01.gof23.adapter.impl.MyHdmiToHdmiCable;
import xin.yangshuai.basic01.gof23.adapter.impl.MyVgaMonitor;

public class Main {

    public static void main(String[] args) {

        String showContent = "hdmi显示器可以显示内容了";
        HdmiMonitor hdmiMonitor = new MyHdmiMonitor();
        HdmiToHdmiCable hdmiToHdmiCable = new MyHdmiToHdmiCable();
        HdmiComputer hdmiComputer = new MyHdmiComputer();

        hdmiMonitor.setShowContent(showContent);
        hdmiToHdmiCable.connect(hdmiMonitor);
        hdmiComputer.connect(hdmiToHdmiCable);

        String show = hdmiComputer.show();
        System.out.println(show);
    }
}

响应信息

通过当前设备:hdmi电脑
通过当前设备:hdmi到hdmi数据线
通过当前设备:hdmi显示器
hdmi显示器可以显示内容了

第二种连接方式代码示例

现在没有hdmi显示器,只有vga显示器,因此还需要一个hdmi转vga的转接线

vga显示器接口
package xin.yangshuai.basic01.gof23.adapter;

public interface VgaMonitor {

    /**
     * 设置显示内容
     */
    void setShowInfo(String showInfo);

    /**
     * 显示内容
     */
    String display();
}
vga显示器实现类
package xin.yangshuai.basic01.gof23.adapter.impl;

import xin.yangshuai.basic01.gof23.adapter.VgaMonitor;

public class MyVgaMonitor implements VgaMonitor {

    private String showInfo;

    @Override
    public void setShowInfo(String showInfo) {
        this.showInfo = showInfo;
    }

    @Override
    public String display() {
        System.out.println("通过当前设备:vga显示器");
        return showInfo;
    }
}
hdmi到vag转换器实现类
package xin.yangshuai.basic01.gof23.adapter;

public class HdmiToVgaAdapter implements HdmiMonitor {

    private VgaMonitor vgaMonitor;

    public void connect(VgaMonitor vgaMonitor) {
        this.vgaMonitor = vgaMonitor;
    }

    @Override
    public void setShowContent(String showContent) {
    }

    @Override
    public String show() {
        System.out.println("通过当前设备:hdmi到vag转换器");
        return vgaMonitor.display();
    }
}
  • 需要注意的是,hdmi到vag转换器实现类是要实现hdmi显示器接口的,因为只有hdmi到vag转换器hdmi显示器接口的能力,才能被hdmi数据线使用。在hdmi数据线看来,hdmi到vag转换器就是一种hdmi显示器
  • hdmi到vag转换器内部的流程是要连接vga显示器,从而达到显示器显示内容的目的
方法调用测试
package xin.yangshuai.basic01.gof23.adapter;

import xin.yangshuai.basic01.gof23.adapter.impl.MyHdmiComputer;
import xin.yangshuai.basic01.gof23.adapter.impl.MyHdmiMonitor;
import xin.yangshuai.basic01.gof23.adapter.impl.MyHdmiToHdmiCable;
import xin.yangshuai.basic01.gof23.adapter.impl.MyVgaMonitor;

public class Main {

    public static void main(String[] args) {

        String showInfo = "vga显示器可以显示内容了";
        VgaMonitor vgaMonitor = new MyVgaMonitor();
        HdmiToVgaAdapter hdmiToVgaAdapter = new HdmiToVgaAdapter();
        HdmiToHdmiCable hdmiToHdmiCable1 = new MyHdmiToHdmiCable();
        HdmiComputer hdmiComputer1 = new MyHdmiComputer();

        vgaMonitor.setShowInfo(showInfo);
        hdmiToVgaAdapter.connect(vgaMonitor);
        hdmiToHdmiCable1.connect(hdmiToVgaAdapter);
        hdmiComputer1.connect(hdmiToHdmiCable1);

        String show1 = hdmiComputer1.show();
        System.out.println(show1);
    }
}

响应信息

通过当前设备:hdmi电脑
通过当前设备:hdmi到hdmi数据线
通过当前设备:hdmi到vag转换器
通过当前设备:vga显示器
vga显示器可以显示内容了

如有不对,欢迎指正!

;