一、引出适配器模式概念
我们要给手机充电,但是我们知道家用电是220v,而我们的手机一般是5v,如果我们直接使用那显然是不行的。这时候我们就需要一个转换器,也就是我们的充电器。它在内部把220v转换成5v。
我们的适配器也是同理,当我们需要使用某个类但是不能直接使用,这个时候就需要适配器来进行一下转换。
二、适配器
一个适配器包含了三种角色:
- 资源对象(src)
- 适配器(adapter)
- 目标接口(dist)
2-1:类适配器
2-1-1:src 资源对象
// 220v 电压提供者
public class Src220V {
public int outPut220V(){
int src = 220;
return src;
}
}
2-1-2:dist接口
// 提供一个5v的接口
public interface Dist5V {
int outPut5v();
}
2-1-3:adapter 适配器
public class adapter extends Src220V implements Dist5V {
@Override
public int outPut5v() {
int i = outPut220V();
// ---- 具体的转换业务
// ---
return i / 44;
}
}
2-1-4:测试
public class Main {
public static void main(String[] args) {
new adapter().outPut5v();
}
}
类适配器: 适配器继承资源对象,然后实现目录接口重写里面的方法。
总结
- 优点:直接继承了src类,可以重写里面的方法,试得Adapter更加的灵活。
- 缺点:因为Java里面是单继承的,这次继承之后,我们后面就无法再继承了,并且继承src那么dist就必须是接口。
2-2:对象适配器
类适配器,使用继承存在问题。对象适配器使用组合的方式解决单继承的问题。
2-2-1:src 资源对象 (不需要改变)
// 220v 电压提供者
public class Src220V {
public int outPut220V(){
int src = 220;
return src;
}
}
2-2-2:dist接口 (不需要改变)
// 提供一个5v的接口
public interface Dist5V {
int outPut5v();
}
2-2-3:adapter 适配器
public class adapter implements Dist5V {
private Src220V src220V;
public adapter(Src220V src220V){
this.src220V = src220V;
}
@Override
public int outPut5v() {
int i = 0;
if (src220V != null){
i = src220V.outPut220V();
// ---- 具体的转换业务
// ---
i = i / 44;
}
return i;
}
}
2-2-4:测试
public class Main {
public static void main(String[] args) {
new adapter(new Src220V()).outPut5v();
}
}
总结
- 优点:根据合成复用原则,使用组合代替了继承。解决了继承问题和dist必须是接口的问题。
- 缺点:我们实现了 dist 接口,就必须实现里面全部的方法,有些方法我们不需要也必须实现。
2-3:接口适配器
在JDK8之前,我们的解决办法是让一个抽象类实现接口里面的方法(空实现),然后我们继承抽象类就可以选择性的覆盖里面的方法了。
在JDK8之后,我们的接口支持默认实现了,这样的话,我们就不需要一个中间抽象类了。
2-3-1:我们修改 dist 接口
public interface Dist5V {
default int outPut5v(){
return 5;
}
default int outPut8v(){
return 8;
}
default int outPut10v(){
return 10;
}
}