接下来我们来讲述适配器模式。我们用问答的方式 来进行讲解。
书中给出了一个非常好的场景demo,出国旅行,A国的国民民用电压是110v,而我们国家的是220v,那么我们出国之后还能给笔记本电脑充电么?
答案是可以的,我们可以通过笔记本电脑的电源适配器进行充电!
2、那么GOF对适配器模式的定义是什么呢?
答:将一个类的接口转换成客户希望的另一个接口。适配器模式使得原本由于接口不兼容而不能一起工作的类可以一起工作。
3、适配器模式有几种类型呢?
答:两种
- 类适配器模式:需要用到多继承这个概念,但是java中并没有多继承这一说,可用接口来实现。
- 对象适配器模式:不是通过继承方式,而是通过对象组合的方式处理
4、适配器模式有几个成员?
答:三个
- 目标(Target):客户端希望直接接触的类,给客户端提供了调用的接口
- 被适配者(Adaptee):被适配者是已经存在的类,即需要被适配的类
- 适配器(Adapter):适配器对Adaptee的接口和Target的接口进行适配
5、适配器的模式结构图?
6、适配器的模式的基本代码体现?
我们就用笔记本电脑充电这个场景,来讲解一下:
对象适配器模式
(1)笔记本电脑充电请求
/**
* 笔记本期望的充电220v接口
**/
public interface Target {
public void request220();
}
(2)需要被适配的110v电源
/**
* 需要被适配的电源插座
**/
public class Adaptee {
public void request110(){
System.out.println("提供110v的充电请求");
}
}
(3)适配器电源
/**
* 适配器
**/
public class Adapter implements Target{
private Adaptee adaptee;
public Adapter (Adaptee adaptee){
this.adaptee=adaptee;
}
//覆盖target的Request220方法
@Override
public void request220(){
//适配110v的充电插座
System.out.println("适配器:适配110v的充电插座");
adaptee.request110();
}
}
(4)充电测试
/**
* 测试
**/
public class Test {
public static void main(String[] args) {
Target target=new Adapter(new Adaptee());
//笔记本电脑使用适配器的充电请求
target.request220();
}
}
运行结果如下:
类适配器模式
需要对适配器的代码进行一些修改:如下所示
(1)适配器电源
/**
* 适配器 适配器类,继承了被适配类,同时实现标准接口
**/
public class Adapter extends Adaptee implements Target{
//覆盖target的Request220方法
@Override
public void request220(){
//适配110v的充电插座
System.out.println("适配器:适配110v的充电插座");
super.request110();
}
}
(2)标准接口的实现类
/**
*标准功能的实现接口类
**/
public class TargetImpl implements Target{
@Override
public void request220() {
System.out.println("提供220v充电功能");
}
}
(3)测试类
public class Test1 {
public static void main(String[] args) {
Target target=new TargetImpl();
target.request220();
Target adapter = new Adapter();
adapter.request220();
}
}
输出结果如下
7、适配器都有哪些优点呢?
- 客户端通过适配器调用目标接口。
- 使用之前方法的功能,而不需要修改之前的方法。
8、适配器都有哪些缺点呢?
- 适配器会增加代码的复杂度,增加维护的难度。
- 如果在业务逻辑里面经常使用适配器,会大大降低代码逻辑业务的可读性。
9、我们在何种场景下使用适配器模式呢?
- 在代码重构的过程中,配合前文讲的代理模式,可以在重构业务的初期使用适配器模式。
- 在业务逻辑解耦的过程中,比如拆分微服务的过程中,可以暂时使用适配器模式。