适配器模式
● 将一个类的接口转换成客户端希望的另外一个接口。适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以在一起工作
● 举个例子,以前的键盘大多是PS/2接口的,假如你的笔记本想使用这个键盘,但笔记本只有USB接口,这个时候就需要一个适配器(PS/2转USB接口),相比于买一个新的键盘,买一个转接口开销更小。编程也是一样,相比于重新编写一个类,写一个适配器来调用它更加方便。
工作场景
- 经常用来做旧系统的改造和升级
代码实现
Adaptee(需要被适配的类)
public class Adaptee {
public void request() {
System.out.println("打字");
}
}
Target(客户端所期待的接口)
public interface Target {
void handleReq(); //处理客户请求得方法
}
Adapter(适配器):类适配器方式
public class Adapter extends Adaptee implements Target{
@Override
public void handleReq() {
super.request(); //继承被适配类,调用它的方法
}
}
Client(客户端)
public class Client {
public void test1(Target t) {
t.handleReq(); //调用目标接口处理方法
}
public static void main(String[] args) {
Client c = new Client();
Target t = new Adapter();
c.test1(t);
}
}
我们知道Java只能单继承,所以使用类适配器的方式不够灵活,因为它已经继承了被适配类,就不能再继承其他类,所以我们使用另外一种方式,对象适配器
Adapter2(适配器):对象适配器方式
public class Adapter2 implements Target{
private Adaptee adaptee;
//构造函数传入对象
public Adapter2(Adaptee adaptee) {
super();
this.adaptee = adaptee;
}
@Override
public void handleReq() {
adaptee.request(); //被适配对象调用它的方法
}
}
Client(客户端)
public class Client {
public void test1(Target t) {
t.handleReq(); //调用目标接口处理方法
}
public static void main(String[] args) {
Client c = new Client();
Adaptee a = new Adaptee();
Target t = new Adapter2(a); //传入被适配对象
c.test1(t);
}
}