我目前正在开发一个使用第三方库来管理硬件的项目。
我希望创建一个提供相同界面的替代库,但不是控制实际硬件,而是提供一个漂亮的假 GUI。最好这可以通过更换罐子来完成。
问题是所有第三方代码都在 namespaceedu.edu.wpi.first.wpilibj
中,当然我的库的命名空间会非常不同。
有没有什么方法可以在两个库之间轻松切换实现,在 java 中提供相同的接口?
我目前正在开发一个使用第三方库来管理硬件的项目。
我希望创建一个提供相同界面的替代库,但不是控制实际硬件,而是提供一个漂亮的假 GUI。最好这可以通过更换罐子来完成。
问题是所有第三方代码都在 namespaceedu.edu.wpi.first.wpilibj
中,当然我的库的命名空间会非常不同。
有没有什么方法可以在两个库之间轻松切换实现,在 java 中提供相同的接口?
是的,有设计模式可以做到这一点。
您可以查看策略模式。
更好的是,您可以查看Dependency injection。
您可以使用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();
}
}
现在你需要做的就是接线。看看谷歌 guice 配置。
是的。服务加载器。它允许通过将 jar 放入类路径(或通过某些配置)来切换实现。但它对现有代码没有帮助。(但一旦完成,切换到任何其他实现都很容易。
使用它的库很容易,但如果库不使用它,则很难引入服务加载。您需要创建服务加载包装器。如果另一个库使用原始库,您也需要更改并重新编译它。
另一种方法是将它放在与原始库相同的包中并镜像其公共接口。但这很丑陋。