一、适配器模式
什么是适配器模式
这是一种结构型模式,我们知道结构型模式的核心作用:是从程序的结构上实现松耦合,从而可以扩大整体的类结构,用来解决更大的问题。适配器模式就是将一个类的接口转换成客户希望的另外一个接口。Adapter
模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。-
模式中的角色
- 目标接口(
Target
):客户所期待的接口。目标可以是具体的或抽象的类,也可以是接口。 - 需要适配类(
Adaptee
):需要适配的类或适配者类 - 适配器(
Adapter
):通过包装一个需要适配的对象,把原接口转换成目标接口
- 目标接口(
-
工作中的场景
- 经常用来做旧系统改造和升级
- 如果我们的系统开发之后再也不需要维护,那么很多模式都是没必要的,但是不幸的是,事实却是维护一个系统的代价往往是开发一个系统的数倍。
我们学习中见过的场景
java.io.InputStreamReader(InputStream)
java.io.OutputStreamWriter(OutputStream)
二、实例
首先我们给出一个需要适配的对象
Adaptee.java
package cn.itcast.day235.adapter;
//被适配的对象
public class Adaptee {
public void request(){
System.out.println("可以完成客户请求需要的功能的类");
}
}
说明:这里是一个需要适配的对象,比如一个键盘,这个键盘的接口不是usb
接口,于是我们的笔记本(客户端)不能直接使用此键盘。于是我们需要一个适配器。
Target.java
package cn.itcast.day235.adapter;
public interface Target {
void handleReq();
}
说明:这是一个适配器的接口,到时候客户端在使用的时候就只是和这个接口打交道了。具体的适配器有两种方式,如下:
Adapter.java
package cn.itcast.day235.adapter;
//类适配器方式
//适配器,需要和需要被适配的类Adaptee关联起来,这里我们使用继承的方式联系起来
public class Adapter extends Adaptee implements Target{
public void handleReq() {
super.request();
}
}
说明:这是一种方式,具体的适配器我们需要和需要被适配的对象联系起来,这里使用了继承的方式来建立这种联系,但是在java
中使用继承有时候可能会不利于扩展。
Adapter1.java
package cn.itcast.day235.adapter;
//对象适配器(使用组合的方式)
//适配器,之前那种使用继承和需要被适配的对象联系起来的方式不好
public class Adapter1 implements Target{
private Adaptee adaptee;
public Adapter1(Adaptee adaptee) {
this.adaptee = adaptee;
}
public void handleReq() {
adaptee.request();
}
}
说明:这里我们是通过构造器将需要适配的对象传递进去。此时客户端在使用的时候就只需要和接口(相当于一个转接线)打交道了。
Client.java
package cn.itcast.day235.adapter;
//客户端
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 Adapter();方式一
Target t = new Adapter1(a);//方式二
c.test1(t);
}
}
说明:这样我们的笔记本(客户端)就能够使用键盘(被适配的对象)了,使用一个转接线(适配接口)来达到此目的。