适配器模式

157 阅读1分钟
适配器模式
需求

讯飞,百度,有道的语音回调接口完全不一样,如何统一接口?

基于继承和组合的适配器模式思想来实现?
  • 继承:

把三家的接口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封装进XReconizeYReconizeZReconize,触发到每一个函数就需要用listener调用,其实这前后两个模式一个采用继承实现的方式实现了适配器,一个采用组合模式实现了适配器。也就是适配器理论上所讲的,一个是类适配器模式,一个是对象适配器模式