繁体   English   中英

轻松切换java库的两个不同实现?

[英]Easily switching between two different implementations of a java library?

我目前正在开发一个使用第三方库来管理硬件的项目。

我希望创建一个提供相同界面的替代库,但不是控制实际硬件,而是提供一个漂亮的假GUI。 优选地,这可以仅通过更换罐来完成。

问题是所有第三方代码都在命名空间edu.edu.wpi.first.wpilibj ,当然我的库的命名空间将会非常不同。

有没有办法在两个库之间轻松切换实现,在java中提供相同的接口?

是的,有设计模式可以做到这一点。

您可以查看战略模式。

更好的是,您可以查看依赖注入

您可以使用Google Guice作为容器,并根据您的配置,在运行时,您的实现可以在使用N库之间切换。

在一天结束时,您需要围绕一些抽象包装这些库。

这是一个例子:

interface ISomeOperation{
    void process();
}

class ThatUsesTheWPILIBJ implements ISomeOperation{

    void process(){
      //use library here
    }

}

class ThatUsesYourMock implements ISomeOperation{
    void process(){
      //use your mock here
    }
}


public YourUIClass{

    private ISomeOperation _operatingClass;


    public YourUIClass(ISomeOperation  operatingClass){

        _operatingClass = operatingClass;
    }

    public void render(){
        _operatingClass.process();
    }
}

现在您需要做的就是接线。 看看google guice配置。

是。 ServiceLoader 它允许通过在类路径中放置jar(或通过某种配置)来切换实现。 但它对现有代码没有帮助。 (但是一旦完成,切换到任何其他实现都很容易。

它易于使用它的库,但如果库不使用它,可能很难引入服务加载。 您需要创建服务加载包装器。 如果另一个库使用原始库,您还需要更改并重新编译它。

另一种方法是将它放在与原始库相同的包中并镜像其公共接口。 但那很难看。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM