参考:https://blog.csdn.net/weixin_48052161/article/details/119119434
定义:
《设计模式》一书中是这样给适配器模式定义的:将一个类的接口转换成客户希望的另外 一个接口。Adapter 模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。
适配器模式将一个类的接口,转化成客户期望的另一个接口,适配器让原本接口不兼容的类可以合作无间。
生活实例:
充电器,美国电器 110V,中国 220V,就要有一个适配器将 110V 转化为 220V。
笔记本电脑接交流电源时需要一个电源适配器
计算机访问照相机的 SD 内存卡时需要一个读卡器等。
在 LINUX 上运行 WINDOWS 程序。
分类:
在《设计模式》一书中将适配器模式分为类适配器模式和对象适配器模式。区别仅在于适
配器角色对于被适配角色的适配是通过继承完成的还是通过组合来完成的。
类适配器:-----继承完成
对象适配器:-----组合完成
案例 1:
笔记本想连接投影仪,但是笔记本自身的接口是HDMI,投影仪的接口是VGA的
为解决这个问题,我们需要一个适配器,把VGA的接口转为HDMI,通过这个适配器就可以实现笔记本电脑和投影仪连接了
代码演示1:继承方式实现:
LaptopComputer继承DataConversionLine将接口转换了,这里的投影仪在这里只起到表示接口开始是vga接口的意思:
Projector类:表示开始使用的是VGA的接口:
package com.example.dtest.design23.adapter.adapter1;
public class Projector {
public void dataLine(){
System.out.println("投影仪使用VGA接口的数据线----播放中-----");
}
}
DataConversionLine类:将vgb转换为hdmi,转化器类
package com.example.dtest.design23.adapter.adapter1;
public class DataConversionLine {
public void vgaToHdmi(){
System.out.println("将VGA数据传输转为HDMI");
}
}
HDMIPort接口类:
package com.example.dtest.design23.adapter.adapter1;
public interface HDMIPort {
void useHDMIPort();
}
需要使用HDMI的接口的类,但现在只有VGB的接口,那么就继承转换器类呀!!!
package com.example.dtest.design23.adapter.adapter1;
public class LaptopComputer extends DataConversionLine implements HDMIPort{
@Override
public void useHDMIPort() {
System.out.println("手提电脑使用的HDMI接口----工作中--------");
}
}
测试类:
package com.example.dtest.design23.adapter.adapter1;
public class Adapter1Test {
public static void main(String[] args) {
// 投影仪
Projector projector = new Projector();
projector.dataLine();
// 手提电脑
LaptopComputer laptopComputer = new LaptopComputer();
laptopComputer.vgaToHdmi();;
laptopComputer.useHDMIPort();
}
}
projector.dataLine();表示的是现在用的VGB的接口
laptopComputer.vgaToHdmi();;表示适配器接口
laptopComputer.useHDMIPort();工作在适配器下的HDMI接口的类
2、对象适配器模式:
笔记本电脑 LaptopComputer02
类适配器:-----组合完成
LaptopComputer02类中自己组合了转换机制!!!
package com.example.dtest.design23.adapter.adapter2;
import com.example.dtest.design23.adapter.adapter1.DataConversionLine;
import com.example.dtest.design23.adapter.adapter1.HDMIPort;
public class LaptopComputer02 implements HDMIPort {
private DataConversionLine dataConversionLine;
public LaptopComputer02() {
super();
// TODO Auto-generated constructor stub
}
public LaptopComputer02(DataConversionLine dataConversionLine) {
super();
this.dataConversionLine = dataConversionLine;
}
@Override
public void useHDMIPort() {
System.out.println("手提电脑使用的HDMI接口----工作中-----");
}
public DataConversionLine getDataConversionLine() {
return dataConversionLine;
}
public void setDataConversionLine(DataConversionLine dataConversionLine) {
this.dataConversionLine = dataConversionLine;
}
}
适配器类:
package com.example.dtest.design23.adapter.adapter1;
public class DataConversionLine {
public void vgaToHdmi(){
System.out.println("将VGA数据传输转为HDMI");
}
}
测试类:
package com.example.dtest.design23.adapter.adapter2;
import com.example.dtest.design23.adapter.adapter1.DataConversionLine;
import com.example.dtest.design23.adapter.adapter1.Projector;
public class Adpater2Test {
public static void main(String[] args) {
// 投影仪
Projector projector = new Projector();
projector.dataLine();
// 转化器
DataConversionLine dataConversionLine = new DataConversionLine();
// 手提电脑
LaptopComputer02 laptopComputer02 = new LaptopComputer02(dataConversionLine);
laptopComputer02.getDataConversionLine().vgaToHdmi();
laptopComputer02.useHDMIPort();
}
}
projector.dataLine();同上
DataConversionLine dataConversionLine = new DataConversionLine();因为是组合模式了,所以要传这个类的实例给工作类:
LaptopComputer02 laptopComputer02 = new LaptopComputer02(dataConversionLine);
laptopComputer02.getDataConversionLine().vgaToHdmi();调用适配方法
laptopComputer02.useHDMIPort();用HDMI工作!!!!
总结:继承和组合天生具有适配的功能,也可以说继承和组合就为适配功能而生,细品!!!!