适配器模式
适配器模式是指,将一个类的接口转换成客户希望的另外一个接口。Adpter 模式使得原本由于接口不兼容而不能一起工作的哪些类可以一起工作
何时使用?
在软件开发前期,类和方法的命名应该就规范地设计好,在一开始出现不兼容时就应该通过重构来同一接口。通常只有在开发后期或维护期,由于双方都不太容易修改接口是,才应该考虑使用适配器模式。
另一种情况是,在设计系统是,考虑使用第三方开发组件,组件的接口和公司的系统接口不同,又没有必要为了迎合它而改变自己的接口,那么在开发前期也可以考虑采用适配器模式。
模式
Target
(客户期待的接口。目标可以是具体的或抽象类,也可以是接口):
public interface Target {
public void request();
}
Adaptee
(需要适配的类):
public class Adaptee {
public void specificRequest() {
System.out.println("特殊请求");
}
}
Adapter
(通过在内部包装一个 Adaptee
对象,把源接口转换成目标接口):
public class Adapter implements Target {
private Adaptee adaptee = new Adaptee();
@Override
public void request() {
adaptee.specificRequest();
}
}
IO 包中的应用
在 java.io 包中,也使用了适配器模式:
ByteArrayInputStream 继承了 InputStream 接口,而内部封装了一个 byte 数组,它将 byte 数组接口适配成 InputStream 流处理器接口。
FileInputStream 继承了 InputStream 接口,而内部有 FileDescriptor对象的引用,它将 FileDescriptor 的接口适配成 InputStream 流处理器接口。
InputStreamReader 将 InputStream 的接口适配成了 Reader 的接口,虽然它内部并不是使用了 InputStream 的引用,而是通过 StreamDecoder 类。
public class InputStreamReader extends Reader {
private final StreamDecoder sd;