适配器模式(Adapter Pattern)
定义
将某个类的接口转换成客户端期望的另一个接口表示,主要目的是兼容性。让原本因接口不匹配不能一起工作的两个类可以协同工作。
场景:
1、开发时需要调用的第三方API并没有拿到,先写个接口并mock个实现类,拿到接口之后再一个适配器进行适配(代码整洁之道第八章提到);
ps:假定这样一个场景会比较容易进行理解
伪代码如下
interface Target{
void targetMethod();
}
class MockTargetImpl implements Target{
void targetMethod(){
System.out.print("这方法将来被其他API实现,届时这个方法将无用");
}
}
class Client{
main(){
Target target = new MokcTarget();
target.targetMethod();
}
}
//第三方API出来了,接口如下
class NewClass{
void newMethod(){
System.out.print("正常要被调用的方法");
}
}
根据预设场景,问题转化为使用target.targetMethod() 如何能调用到NewClass.newMethod()方法。
引入适配器模式
在接口层和真实的实现层中间加一个Adapter实现,并通过Adapter间接调用newMethod方法;
伪代码如下:
class Adapter implements Target{
void targetMethod(){
//这是个假的,在这里并调用不到这个方法,因为Adapter中没有这个方法
newMethod();
}
}
class Client{
main(){
//只要把具体实现类换了,就不需要改动其他的代码了,完美
Target t = new Adapter();
t.targetMethod();
}
}
适配器模式的两种实现
现在还有一个问题没有解决 ,如何在类Adapter的targetMethod()中调用到newMethod()方法
1、通过继承NewClass对象
class Adapter implements Target extends NewClass{
void targetMethod(){
//现在这个方法继承来的
newMethod();
}
}
2、通过拥有NewClass对象
class Adapter implements Target{
NewClass newClass = new NewClass();
void targetMethod(){
//通过对象方法调用
newClass.newMethod();
}
}
适配器模式中的角色
目标接口:Target,客户端希望调用的接口
需要适配的类:NewClass,(在经典的例子中为Adaptee),是真实的需要使用的方法所在的类。
适配器:Adapter,接口的实现类,用于适配NewClass
思考
如果有多个类似NewClass类,可以通过多个Adapter适配器,仅在调用时修改实现类(Adapter1、Adapter2...)即可。
使原本没有继承/实现关系的类可以通过同一个接口进行调用(让原本因接口不匹配不能一起工作的两个类可以协同工作)。