- 什么是适配器模式?
将一个类的接口转换为客户希望的另外一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以在一起工作。
- 模式中的角色
- 目标接口(Target):客户所期待的接口。目标可以是具体的或抽象的类,也可以是接口。
- 需要适配的类(Adaptee):需要适配的类或适配者类。
- 适配器(Adapter):通过包装一个需要适配的对象,把原接口转换成目标接口。
- JDK里典型的适配器模式
java.io.InputStreamReader(InputStream in) 字节流通向字符流的桥梁java.io.OutputStreamWriter(OutputStream out) 字符流通向字节流的桥梁
下面我们以USB转接器作为示例,演示适配器的应用。
假设有一个外接键盘,只能插到PS/2接口上。而我们要把它接到笔记本电脑,笔记本电脑只有USB接口。
于是我们需要一个转接器来连接键盘和笔记本USB口。
在这里,外接键盘是需要适配的对象(Adaptee),笔记本电脑是调用者,笔记本的USB接口是目标接口(Target),而转换器就是我们的适配器。
package com.iter.devbox.adapter;
/**
* 目标对象
* 相当于例子中的USB接口
* @author Shearer
*
*/
public interface Target {
public void handleRequest();
}
package com.iter.devbox.adapter;
/**
* 被适配的类(相当于PS/2键盘)
* @author Shearer
*
*/
public class Adaptee {
//被适配的类的方法
public void request() {
System.out.println("PS/2键盘,我可以打字");
}
}
package com.iter.devbox.adapter;
/**
* 实现了USB接口的,适配器实现类。
* 类适配器方式(采取继承的方式,这种方式不可取)
* 相当于usb和ps/2键盘的转接器
* @author Shearer
*
*/
public class Adapter extends Adaptee implements Target {
@Override
public void handleRequest() {
System.out.println("我是类适配器方式");
super.request();
}
}
package com.iter.devbox.adapter;
/**
* 实现了USB接口的,适配器实现类。
* 对象适配器方式(使用了组合的方式,跟被适配对象整合)
* 相当于usb和ps/2键盘的转接器
* @author Shearer
*
*/
public class Adapter2 implements Target {
private Adaptee adaptee;
@Override
public void handleRequest() {
System.out.println("我是对象适配器方式");
adaptee.request();
}
public Adapter2(Adaptee adaptee) {
this.adaptee = adaptee;
}
}
package com.iter.devbox.adapter;
/**
* 客户端类(相当于例子中的笔记本,只有USB接口)
* @author Shearer
*
*/
public class Client {
public void test1(Target t) {
t.handleRequest();
}
public static void main(String[] args) {
Client client = new Client();
client.test1(new Adapter());
client.test1(new Adapter2(new Adaptee()));
}
}
我是类适配器方式
PS/2键盘,我可以打字
我是对象适配器方式
PS/2键盘,我可以打字
PS/2键盘,我可以打字
我是对象适配器方式
PS/2键盘,我可以打字
上述代码里面,Adapter是类适配器方式(采取继承的方式,这种方式不可取)!
Adapter2是对象适配器方式(使用了组合的方式,跟被适配对象整合),适配器模式都使用这种方式!!