3

バックグラウンド:

増加する場合と増加しない場合があるクラス ( commオブジェクト) のリストがあります。これらはすべて Comms インターフェイスで同じメソッドを実装しています。

public int send(Socket socket, byte[] message);

メソッドの packageName パラメーターでパッケージ名を指定することにより、これらの通信クラスのリストを取得します (関数内で内部的にパッケージ名自体を除外し、パッケージ通信の名前だけを取得するために何らかのフィルタリングを行います)。

public static Class[] getClasses(String packageName); (modified it a bit from the link below)

http://www.dzone.com/snippets/get-all-classes-within-package

次に、通信オブジェクトの1つを基本通信として使用するように構成可能なプラグインがいくつかあります。

通信オブジェクト:


シリアル

クライアント

サーバ


プラグイン:


プラグイン1

プラグイン2


マネージャ クラスは、プラグインから制御パケットを送信するためのリクエストを受け取ります。マネージャは、リクエストをキューに入れ、リクエストごとに send 関数を呼び出します。

質問:

send(Socket socket, byte[] message);マネージャー内のメソッドまたはプラグイン自体にアクセスするにはどうすればよいですか? これには、comm オブジェクトの文字列名から、プラグインの構成に応じて、comm クラスの 1 つからキャストされる、send を呼び出すことができるジェネリック クラス オブジェクトの作成が含まれます。

各プラグインで使用される通信クラスの構成は、データベース内に保存されます。文字列から Class オブジェクトへの変換はうまくいきます。すべての通信クラスによって実装されているインターフェイス Comm に存在する send 関数を呼び出す方法を見つける必要があるだけです。これはジェネリックでなければなりません。さらに通信クラスが追加される可能性があります。

4

1 に答える 1

1

Commマネージャーに参照型インターフェイスを与え、そのsendメソッドを呼び出します。

マネージャーをインスタンス化するときは、必要な実装を注入します。

Comm各タイプの実装をインスタンス化するために、仮想コンストラクター/ファクトリーパターンが既にダウンしているようです。

これは、すべての依存性注入エンジン (Spring、Guice など) に共通のパターンです。

于 2013-05-15T11:25:06.013 に答える