适配器模式简述
- 适配器模式(Adapter Pattern)是作为两个不兼容的接口之间的桥梁,使得原本由于接口不兼容而不能一起工作的那些类可以在一起工作了。这种类型的设计模式属于结构型模式,它结合了两个独立接口的功能。
- 这种模式涉及到一个单一的类,该类负责加入独立的或不兼容的接口功能。举个真实的例子,usb转type-c线将充电宝的usb接口转成type-c接口,从而实现对手机的充电。
模式中的角色:
- 目标接口(Target):客户所期待的接口。目标可以是具体的或抽象的类,也可以是接口。
- 需要是配的类(Adaptee):需要适配的类或者适配类。
- 适配器(Adapter):通过包装一个需要适配的对象,把原接口转换成目标借口
实现方式:
-
类适配器的实现方式--继承方式
-
对象适配器的实现方式--依赖方式(推荐)
创建步骤:
步骤1:创建目标接口(Target),客户所期待的接口(目标可以是具体的或抽象的类,也可以是接口)。
package com.ly.Adapter;
/**
* 适配后的目标接口,相当于type-c接口
* liyang 2020-07-15
*/
public interface Target {
public void charge();
}
步骤2:需要是配的类(Adaptee),需要适配的类或者适配类。
package com.ly.Adapter;
/**
* 被适配者,相当于充电宝(提供usb接口)
* liyang 2020-07-15
*/
public class Adaptee {
public void charging() {
System.out.println("完成充电连接,充电中...");
}
}
步骤3:适配器实现(Adapter),通过包装一个需要适配的对象,把原接口转换成目标借口
- 类适配器实现方式
package com.ly.Adapter;
/**
* 适配器,用于将Adaptee的usb口转换成Target需要的type-c口
* 类适配器的实现方式,即类继承方式(extends)
* liyang 2020-07-15
*/
public class Adapter extends Adaptee implements Target{
@Override
public void charge() {
super.charging();
}
}
- 对象适配器实现方式
package com.ly.Adapter;
/**
* 适配器,用于将Adaptee的usb口转换成Target需要的type-c口
* 对象适配器的实现方式,即类中组合需要的对象(组合方式)
* liyang 2020-07-15
*/
public class Adapter02 implements Target{
private Adaptee adaptee;
public Adapter02(Adaptee adaptee) {
this.adaptee = adaptee;
}
@Override
public void charge() {
adaptee.charging();
}
}
步骤4:客户端测试程序,适配器模式将充电宝提供的usb接口转换成客户端需要的的type-c接口并完成相应地充电操作
package com.ly.Adapter;
/**
* Client模拟手机,拥有type-c母接口,需要type-c连接才能充电
* liyang 2020-07-15
*
* Client需要Adaptee的功能支持,但是二者接口不一致,无法直接连接
* 因此,
* 1、新建一个接口Target
* 2、再建一个类Adapter实现Target,并可使用两种方式得到Adaptee的功能:
* 2.1、继承Adaptee
* 2.2、组合Adaptee
* 3、使用Target类所指向的Adapter类完成功能调用
*
*/
public class Client {
private String deviceName;
public Client(String deviceName) {
this.deviceName = deviceName;
}
public void needCharge(Target t){
t.charge();
}
public static void main(String[] args) {
//使用Adapter实现,使用的是类适配器方式
Client client = new Client("apple"); //手机
Target target = new Adapter(); //转接线usb to type-c
System.out.print(client.deviceName);
client.needCharge(target); //手机充电,交由继承Adaptee类和实现target接口的Adapter去调用
//使用Adapter02实现,使用的是对象适配器方式
Client client02 = new Client("nex"); //手机
Adaptee adaptee = new Adaptee(); //充电宝
Target target02 = new Adapter02(adaptee);//转接线usb to type-c
System.out.print(client02.deviceName);
client02.needCharge(target02); //手机充电,交由继承Adaptee类和实现target接口的Adapter去调用
}
}
结果:
apple完成充电连接,充电中...
nex完成充电连接,充电中...
Process finished with exit code 0
小结:
工作中的场景
- 经常用来做旧系统改造和升级,如果我们的系统开发之后再也不用维护,那么很多模式都是没有必要的,但是不幸的是,事实却是维护一个系统的代价往往是开发一个系统的数倍。
学习中见过的场景
- java.io.InputStreamReader(InputStream)
- java.io.OutputStreamWriter(OutputStream)