3

ライブラリを交換可能にする方法を探しています。例:マルチキャストを介した通信を管理しているライブラリがあります。メインアプリケーションでそのライブラリを使用しています。私のアイデアは、そのためのインターフェースを使用することでした。

public interface MessageHandler {
    public void sendMessage();
    public Message receiveMessage();
}

これで、ライブラリを変更できるようになります。たとえば、ブロードキャストを介した通信を管理しているライブラリ。どちらも同じインターフェースを実装しています。

したがって、私のメインアプリケーションでは、次のような機会が必要です。

MessageHandler mHandler = new MulticastImpl();

または

MessageHandler mHandler = new BroadcastImpl();

私の問題は次のとおりです。インターフェイス定義はどこに配置しますか?メインアプリケーションに配置すると、ライブラリからは表示されません(ライブラリがメインアプリケーションを認識していないため)。両方のライブラリに配置すると、2つの異なるMessageHandler-インターフェイス(たとえば、com.multicast.MessageHandlerとcom.broadcast.MessageHandler)があります。

何か案は?

4

6 に答える 6

3

これは基本的なプラグインシステムです。あなたがすべきことは:

  1. プラグインAPIをスタンドアロンのjarに入れます。
  2. このプラグインAPIjarをメインアプリケーションに含めます。
  3. プラグインの実装にはプラグインAPIを含めないでください(コンパイルに使用するだけです)。
  4. ユーザーがプラグインの「実装」クラスを(構成文字列として)指定する方法を提供します
  5. アプリケーションの起動時に、リフレクションを使用して構成から実装クラスをロードします。

プラグインをJavaにロードするためのより洗練された方法があります(たとえば、java.util.ServiceLoaderやネストされたクラスローダーを使用する)が、これは良いスタートです。

于 2012-07-21T14:00:34.507 に答える
0

ライブラリインターフェイスを使用します。両方に配置しないでください。ライブラリは、ライブラリとの通信に使用されるインターフェイスを定義しています。

ライブラリインターフェイスを使用してプログラミングするメインアプリケーションでは、コードを変更せずに、実装だけを変更して、さまざまな実装に切り替えることができます。

于 2012-07-21T13:58:33.973 に答える
0

いくつかの解決策がありますが(インターフェイスを両方のライブラリに配置するか、インターフェイスを独自のライブラリに配置する)、インターフェイスの名前を1つにする必要があります(例:com.messaging.MessageHandler)。

于 2012-07-21T14:01:38.193 に答える
0

戦略パターンはここで役立ちます。

ライブラリを交換可能にする場合は、このライブラリの機能をカプセル化する戦略を定義します。

コードのどこでも、ライブラリではなく、ストラテジーを呼び出すだけです。その後、戦略はどちらに進むかを選択します。

それを行った後、カプセル化されたストラテジーを他のストラテジーまたはライブラリに置き換えることができます。

戦略パターンの詳細

于 2012-07-21T14:17:57.997 に答える
0

これにはDIを使用できます。お気に入りのDI実装によって実装を注入します。

于 2012-07-21T14:52:00.587 に答える
0

この質問は「答えられた」のですが、とにかく、私はあなたに別の視点をもたらしたいと思います。

同じサービスロジックの実装をシームレスに置き換える方法として、OSGiとサービスのモジュール性を検討する必要があります。OSGiは、インターフェースと実装の分離を強力に実施し、実行時に(再)デプロイすることもできる「バンドル」を備えたモジュラー・アーキテクチャーを提供します。

MulticastMessageHandlerを実装として使用する「MessageHandler」サービスを使用できます。

たとえば、切り替え可能なnoSQLとバックエンドとしてのSQLデータストアを持つデータストアがあります。アプリケーションは、どちらが使用されているかを認識したり、ケースに入れたりすることはありません。

EclipseにはEquinoxOSGiがあり、これはEclipse開発環境に含まれています。

于 2012-07-24T14:29:19.897 に答える