结构型模式的核心作用:从程序的结构上实现松耦合,从而可以扩大整体的类结构,用来解决更大的问题。
1、什么是适配器模式
将一个类的接口转换成客户希望的另一个接口。适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。
比如:有一个键盘,键盘上的接口是PS/2接口,而我们的电脑上只有USB接口,那么就得通过一个转换接头,把键盘连接到电脑上,这个转接头就是适配器。这个适配器的一头是USB接口,可以连接电脑上面的USB接口,另一头是PS/2接口,可以连接到键盘的PS/2接口上面。这样就能实现本来两个接口不兼容的笔记本和键盘连接起来,从而实现打字功能。
2、适配器模式中的角色
1、客户端:上面的例子当中的电脑;
2、目标接口(Target):客户所期待的接口,目标可以是具体的或抽象的类,也可以是接口。相当于例子中电脑上的USB接口:
3、需要适配的类(Adaptee):相当于例子中的PS/2接口的键盘;
4、适配器(Adapter):通过包装一个需要适配的对象,把原接口转换成目标接口。
3、代码实现
3.1 适配器类
package com.zdw.adapter;
/**
* 需要适配的类,相当于PS/2键盘
*/
public class Adaptee {
public void printFont(){
System.out.println("我是一个PS/2接口的键盘,我能打字。。。");
}
}
3.2 目标接口
package com.zdw.adapter;
/**
* 目标接口,相当于电脑上的USB接口
*/
public interface Target {
public void connnectJianPan();//这个方法用来连接USB接口
}
3.3 适配器类
package com.zdw.adapter;
/**
* 适配器,实现了目标接口,同时可以连接需要适配的类
*/
public class Adapter implements Target {
private Adaptee adaptee;
public Adapter(Adaptee adaptee) {
this.adaptee = adaptee;
}
@Override
public void connnectJianPan() {
System.out.println("我能通过USB接口连接电脑,也可以通过PS/2接口连接键盘");
adaptee.printFont();//可以调用需要适配的类的打字功能
}
}
3.4 客户端
package com.zdw.adapter;
/**
* 客户端,相当于是电脑
*/
public class Computer {
public void print(Target target){
System.out.println("我是一台只有USB接口的电脑");
target.connnectJianPan();
}
}
3.5 测试
package com.zdw.adapter;
public class TestAdapter {
public static void main(String[] args) {
Computer computer = new Computer();
Adaptee adaptee = new Adaptee();
Target target = new Adapter(adaptee);
computer.print(target);
}
}
4、工作中的场景
经常用来做旧系统的改造和升级;
JDK中的转换流也是适配器模式的具体应用,java.io.InputStreamReader(InputStream),java.io.OutputStreamWriter(OutputStream)。