声明:原创作品,转载请注明出处https://www.jianshu.com/p/57f74d555068
今天总结下适配器模式,适配器模式的作用是将一个接口转换成用户期待的接口,也就是可以把两个不兼容的接口放在一起工作。这样讲可能有点抽象,接下里看下这个设计模式在代码中的体现。
适配器模式分两种,对象适配器模式
和类适配器模式
,先来看下对象适配器模式。
1.对象适配器模式
看到适配器这个名字,我们自然而然就会想到电源适配器,或者叫充电器,所以就拿手机充电器来举个例子。我们知道给手机充电时,所需要的电压是比较小的,一般也就5v左右,但是我们家里的插座提供的电源都是220v,我们不可能直接把我们的手机接到220v的电源下,不然手机直接原地爆炸。所以这就出现了一个问题,就是两边的电压不对等,或者说两边的接口即输出电流的接口和接入手机的接口不兼容。那这时手机的电源适配器或者说充电器就出现了,通过一个转换头把220v电压转为手机可承受的5v电压,这样手机就充上电了。然后我们看下这个例子用代码如何体现:
首先我们需要定义一个目标接口,也就是我们需要的接口,在这里就表示手机需要一个type-c接口;
//手机需要接入这个type-c接口
interface TypeC {
//这个接口输出5v电压
void v5();
}
接着有一个插座类,提供220v的电源:
class Socket {
public void v220() {
System.out.println("接入220v电源");
}
}
接下来我们需要定义一个适配器类来把220v的电源转换为手机需要的5v电源:
class PowerAdapter implements TypeC {
public Socket socket;
public void plugIntoSocket(Socket socket) {
this.socket = socket;
}
@Override
public void v5() {
socket.v220();
}
}
接着看下客户端的调用过程:
PowerAdapter powerAdapter = new PowerAdapter();
Socket socket = new Socket();
powerAdapter.plugIntoSocket(socket);
powerAdapter.v5();
代码逻辑很清晰,首先创建了一个适配器对象PowerAdapter和插座对象Socket,接着调用PowerAdapter的plugIntoSocket方法把适配器插到220v的电源插座上,这样PowerAdapter对象就有了一个插座Socket的依赖,接着调用我们的目标接口也就是PowerAdapter的v5方法,而这个方法内部其实调用Socket的v220方法,这样我们就通过PowerAdapter这个适配器把220v电压转换成了我们需要的5v电压。也就是通过这个适配器我们把不兼容的两个接口可以一起工作了。在适配器模式中我们把PowerAdapter叫做适配器Adapter
,把Socket叫做被适配者Adaptee
,把我们需要调用的接口TypeC叫做目标接口Target
,这里我们被适配者Adapee是作为一个实例对象被依赖所以我们叫上面这种形式的适配器模式叫做对象适配器模式
。
我们来看下对象适配器模式的类图:
2.类适配器模式
接下来我们看下类适配器模式,我们还是举上面手机充电的例子。首先我们同样需要定义一个目标接口和一个插座类即被适配类,和上面不变
目标接口(Target)
//手机需要接入这个type-c接口
interface TypeC {
//这个接口输出5v电压
void v5();
}
被适配类(Adaptee)
class Socket {
public void v220() {
System.out.println("接入220v电源");
}
}
接下来还是需要定义一个适配器类,不过实现和上面有点不同:
适配器(Adapter)
class PowerAdapter extends Socket implements TypeC {
@Override
public void v5() {
this.v220();
}
}
可以看到这里和上面的一样同样实现了Typec接口,不同的是上面通过plugIntoSocket方法引入了Socket对象,而这里PowerAdapter是直接继承了Socket类,这样当我们调用v5这个方法时,就直接可以调用到v220这个方法,来实现接口的转换。我们称这种适配器模式为类适配器模式
。
最后看下类适配模式类图
3.总结
适配器模式在我们项目中往往扮演的是一个救火员的角色,它可以解决新老版本接口不兼容的问题,引入适配器来达到解耦的目的,当然我们还是尽量在项目中少用到适配器模式,我们应该在项目一开始的时候对项目要有一个全局的把控,而不是到了出问题了才用适配器来救火,如果用到太多的适配器,反而使项目变得复杂。
到这适配器模式分析的差不多了,相信你对适配器模式有了一定的了解。
设计模式持续更新中...