精心整理了设计模式——适配器模式,并配图加代码,方便理解,实属不易,但是难免不了存在纰漏,感谢大家的指正与理解!觉的写的不错的小伙伴儿,一键三连支持一下,后期会有持续更新!!抱拳了罒ω罒
适配器模式的简介
-
把一个类的接口变换成客户端所期待的另一种接口,从而使原本接口不匹配而无法一起工作的两个类能够在一起工作。
-
分类:适配器模式主要分为类适配器模式和对象适配器模式
-
角色:
- 被适配者( Adaptee ):需要被适配的类,就是原接口
- 适配器( Adapteer ):包装一个对象,将原接口转换成目标接口
- 适配者(Target ):目标接口,用户所需要的接口
-
以电脑网线接口为例,需要将网线接口利用适配器转换成USB接口,说明适配器的用法:
类和接口之间的关系图
1. 类适配器模式
Adapter类,通过继承原接口(Adaptee)类,实现接口转换。
NetToUsb接口:定义适配器的规范接口
interface NetToUsb{
//转换器的转换接口功能
public void handleRequest();
}
NetLine类:这是网线接口类,即原接口( Adaptee )
class NetLine{
public void request(){
System.out.println("这是网线接口,连接后开始上网");
}
}
Adapter 类:适配器类,具有转换接口的功能
class Adapter extends NetLine implements NetToUsb {
//拿到网线接口并转换
@Override
public void handleRequest() {
request();
System.out.println("适配器将网线接口转换为USB接口");
}
}
ComputerUsb类:电脑的USB接口,即目标接口( Target )
class ComputerUsb{
public void net(NetToUsb adapter){
//适配器将接口转换为USB接口
adapter.handleRequest();
//电脑连接适配器的USB接口进行上网
System.out.println("电脑连接适配器USB接口,开始上网");
}
}
演示:
public class AdapterTest {
public static void main(String[] args) {
//适配器类
Adapter adapter = new Adapter();
//电脑类
ComputerUsb cu = new ComputerUsb();
//电脑跟适配器连接即可上网
cu.net(adapter);
//输出
//这是网线接口,连接后开始上网
//适配器将网线接口转换为USB接口
//电脑连接适配器USB接口,开始上网
}
}
总结
- 对于Java等单继承语言,一次只能适配一个是适配者,不能同时适配多个适配者。
- 通过继承来实现适配,违背了设计模式的 “合成复用” 原则
2. 对象适配器模式(推荐)
Adapter类,基本思路和类的适配器模式相同,只是将Adapter类作修改,不再继承原接口(NetLine类),而是持有原接口(NetLine类)的实例,以解决兼容性的问题。
适配器接口(NetToUsb),原接口(NetLine),目标接口(ComputerUsb)都是不用变化,变化的只有Adapter 类。
Adapter 类:适配器类,持有原接口(NetLine类)的实例。
class Adapter implements NetToUsb {
private NetLine line;
public Adapter(NetLine line) {
this.line = line;
}
@Override
public void handleRequest() {
line.request();
System.out.println("适配器将网线接口转换为USB接口");
}
}
演示:
public class AdapterTest {
public static void main(String[] args) {
//网线接口
NetLine line = new NetLine();
//适配器类是有网线接口
Adapter adapter = new Adapter(line);
//适配器与电脑USB相连并上网
ComputerUsb cu = new ComputerUsb();
cu.net(adapter);
//输出
//这是网线接口,连接后开始上网
//适配器将网线接口转换为USB接口
//电脑连接适配器USB接口,开始上网
}
}
总结
- 对象适配器和类适配器其实算是同一种思想,只不过实现方式不同。
- 使用成本更低,更灵活