适配器模式
需求
讯飞,百度,有道的语音回调接口完全不一样,如何统一接口?
基于继承和组合的适配器模式思想来实现?
- 继承:
把三家的接口B,X,Y全部实现,然后再转接给目标接口比如:
public abstract class AdapterListener implements B, X, Y {
abstract void f1();
abstract void f2();
abstract void f3();
@Override
public void x_f1() {
f1();
}
@Override
public void x_f2() {
f2();
}
@Override
public void x_f3() {
f3();
}
@Override
public void b_f1() {
f1();
}
@Override
public void b_f2() {
f2();
}
@Override
public void b_f3() {
f3();
}
@Override
public void y_f1() {
f1();
}
@Override
public void y_f2() {
f2();
}
@Override
public void y_f3() {
f3();
}
}
所以我就可以这样调用,所以无论是哪个公司的接口最后都会回调到f1(),f2(),f3()函数中来:
public static void main(String[] args) {
BaseReconize baseReconize = new BReconize();
AdapterListener adapterListener = new AdapterListener() {
@Override
void f1() {
}
@Override
void f2() {
}
@Override
void f3() {
}
};
baseReconize.start(adapterListener);
}
}
public abstract class BaseReconize {
abstract void start(AdapterListener listener);
}
public class BReconize extends BaseReconize {
@Override
void start(AdapterListener listener) {
}
}
public class XReconize extends BaseReconize {
@Override
void start(AdapterListener listener) {
}
}
public class YReconize extends BaseReconize {
Yreconizer yreconizer = new Yreconizer();
@Override
void start(AdapterListener listener) {
yreconizer.startReconize(listener);
}
}
当然这样的实现方式并不优雅,如果接口过多adpterListener有点乱,我们可以把回调接口X,Y,B封装进XReconize,YReconize,ZReconize,触发到每一个函数就需要用listener调用,其实这前后两个模式一个采用继承实现的方式实现了适配器,一个采用组合模式实现了适配器。也就是适配器理论上所讲的,一个是类适配器模式,一个是对象适配器模式