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显示器可以显示内容了
如有不对,欢迎指正!