7

利用可能な OSGi サービスを動的に選択できるインテリジェントなシステムを念頭に置いています。つまり、実行時パラメータに応じて、実装または別の実装を選択します。たとえば、実行中のアルゴリズムに通知して、数回の反復後にオペレーターを変更したり、システムの負荷分散などに応じて変更したりします。

while(stopCriterion){
    operator.doSomething(); //There exist many operator implementations
}

私の最初のアプローチは、DS を使用してサービスを公開し、サービスを 0..n および動的ポリシーにバインドすることです。次に、外部のインテリジェントコンポーネントから、各反復で使用するサービスをアルゴリズムに通知します ( EventAdminを使用しますか?)。

operator[selected].doSomething();

これは、多くの異なるサービス実装で多くの実験を実行する必要がある場合に、複雑さを軽減するのに役立ちます。また、 Eclipse Communication Frameworkで Remote Services 仕様を使用して、分散アルゴリズムなどの研究を行う予定であるため、実行時に新しい実装が動的に現れることも可能になる可能性があります。

ただし、これが良いアイデアなのか、それとも実装を使用するかを動的に選択するための別のより良いメカニズムが存在するのかはわかりません。DSの代わりにServiceTrackerを使用するのは良い選択肢ではないと思いますが、提案は受け付けています:)

前もって感謝します。

4

2 に答える 2

5

これは、サービスを使用して非常にうまく実装できる戦略パターンのように見えます。と呼ばれるタイプのサービスがある (および同じ名前のインターフェースがある) と仮定するとOperator、これはおおまかに次のように機能します。

  • 必要な機能といくつかの追加情報 (この実装が適切な場合など) を含むサービスを作成し、OperatorProviderそのインスタンスを戦略ごとに 1 つずつ作成します。
  • インターフェイスを実装するセレクター サービスを作成Operatorし、サービスへのすべての呼び出しを最適なOperatorProvider. このサービスが最適なプロバイダーを選択する方法は、おそらくインテリジェンスの一部です。
  • サービスの実際のユーザーは、サービスにのみ依存するOperatorようになり、プロバイダーの選択について心配する必要がなくなりました。

選択戦略をセレクター サービスに入れることができると思いますが、それが本当に外部コンポーネントである場合は、インテリジェント コンポーネントとセレクターの間の通信を処理する任意のメカニズム (サービス インターフェイス、イベントなど) を使用できます。

于 2011-04-27T12:41:31.613 に答える
0

ある種の動的戦略パターンや依存性注入さえもあなたのニーズに合うと思います。一部のクラスは、実行時に変更できる戦略 ( operatorと呼びます) を使用します。どの戦略を使用するかを伝えることができる別のサービスがあると思います(ランタイムパラメーターに基づいて)。

大まかな実装は次のようになります。

public Worker {
  private Operator operator;    // your actual operator strategy
  public void setOperator(Operator actualOperator) {
    this.operator = operator;
  }

  public doSomething() {

     while(stopCriterion) {
       Operator operatorForThisIteration = operator;  // pick the injected service
       operatorForThisIteration.doSomething;
     }
  }
}

また、ワーカー インスタンスに依存関係を注入できる別のサービスは、すべてのワーカー インスタンスのリストを維持し、新しいサービスを選択してすべて (または一部) のワーカーに注入するロジックを実装します。

于 2011-04-27T12:43:22.203 に答える