2

私は現在、サードパーティのライブラリを使用してハードウェアを管理するプロジェクトに取り組んでいます。

同じインターフェイスを提供する代替ライブラリを作成したいのですが、実際のハードウェアを制御する代わりに、偽のGUIを提供するだけです。できれば、これは瓶を交換するだけで行うことができます。

問題は、すべてのサードパーティコードが名前空間edu.edu.wpi.first.wpilibjにあることです。もちろん、私のライブラリの名前空間は大きく異なります。

Javaで同じインターフェースを提供する2つのライブラリ間で実装を簡単に切り替える方法はありますか?

4

2 に答える 2

3

はい、それを行うためのデザインパターンがあります。

ストラテジーパターンを調べることができます。

さらに良いことに、依存性注入を調べることができます。

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();
    }
}

今、あなたがする必要があるのは配線だけです。googleguiceconfiguraionを見てください。

于 2013-01-19T22:15:59.553 に答える
1

はい。ServiceLoader。jarをクラスパスに入れることによって(またはいくつかの構成によって)実装を切り替えることができます。ただし、既存のコードには役立ちません。(ただし、一度実行すると、他の実装への切り替えは簡単です。

それを使用するライブラリは簡単ですが、ライブラリがそれを使用しない場合、サービスのロードを導入するのは難しい場合があります。サービスローディングラッパーを作成する必要があります。また、別のライブラリが元のライブラリを使用している場合は、それも変更して再コンパイルする必要があります。

別のアプローチは、元のライブラリと同じパッケージに入れて、パブリックインターフェイスをミラーリングすることです。しかし、それは醜いです。

于 2013-01-19T22:24:24.887 に答える