0

複数の被験者と複数のオブザーバーが存在するパターンの設計に取り組んでいます。各オブザーバーは、出力を生成するために知る必要があることを知っているため、コンストラクターで必要なサブジェクトに自分自身を登録します。私が最初に考えたのは、サブジェクトをシングルトン クラスにすることでしたが、それには、各サブジェクトを個別にシングルトンにするか、abstract staticJava がサポートしていないクラスにする必要があることがわかりました。要するに、私は最善の解決策が実際に何であるかを理解しようとしています. それが本当に明確であることを確認するために、ここに私がやろうとしていることがあります:

  1. 複数科目になります。各オブザーバーは、複数の対象を観察することができます。これを機能させるために、オブザーバーに対してそれ自体を識別するように、各サブジェクトにリソース コードを用意します (`update(SUBJECT_1) ここで、SUBJECT_1 はサブジェクト 1 に対応する int です)。
  2. 各オブザーバーは、建設時に観察したい対象を知っています。
  3. 作成された各サブジェクトの単一のインスタンスのみが必要です。
  4. 一部のオブザーバーは、今度は被験者自身になる可能性があります。
  5. 一般に、フロー パターンがあります。最終的には、より抽象的な概念を作成するいくつかの入力ソースがあります。オブザーバー/サブジェクトのフロー図は次のようになります。

ここに画像の説明を入力

これにはまったく別のデザイン パターンが必要になるかもしれないと考えていますが、一般的なデザイン パターンにはまだかなり慣れていないので、飛び込む前にもう少し経験を積んでおこうと思いました。ありがとう!

明確にするために、シングルトンは次のように機能します。つまり、すべてのサブジェクトがシングルトンであるabstractSubjectが必要です。それぞれを単独でシングルトンにすることもできますが、この疑似コードのような getInstance を使用するように強制することをお勧めします。

abstract class abstractSubject{

AbstractSubject instance=null;

public static AbstractSubject getInstance()
{
    if (instance==null)
        instance=new AbstractInstance();
    return instance;
}
abstract void attach();
//More stuff will go here to make it a subject
}

//Define Subject1, Subject2 classes fully

class Observer1 extends AbstractObserver{

    public Observer1()
    {
        Subject1.getInstance().attach(this);
        Subject2.getInstance().attach(this);
    }
    //Other stuff goes here to make it an observer
}
4

4 に答える 4

1

これを少し考えてみると、このようなパターンを持つのが最善のように思えます。これは Builder または Factory クラスのいずれかに関連していると思いますが、それがどのように機能するかについてはまだ解決しようとしています.

  1. 作成されたすべてのサブジェクトを追跡し、要求された場合にそれらへの参照を提供することを仕事とするサードパーティ クラスがあります。より適切な用語がないため、私はこれをブローカーと呼びます。
  2. 各オブザーバーは、このブローカーにアクセスできます。ブローカに必要なものを要求し、まだインスタンス化されていない場合は、ブローカがオブジェクトを作成します。

すべてのオブザーバーがこの Broker を使用するように構築されている場合、Broker が必要なものを返すための呼び出しを知っていれば十分です。これは十分に単純なはずです。Broker は、新しいサブジェクトが作成されるたびに更新する必要がありますが、それ以外の場合は、これをすべて機能させるために思いつく最もクリーンな方法のようです。

さらに、Broker クラスには、すべてのサブジェクトを含む Enum が含まれているため、特定のクラスに対応する Enum 値を追跡するための効率的なポイントとして機能できます。

これは次のようになります。

public class Broker {
    public enum Subject {Subj1, Subj2};

    static private Broker instance=null;

    HashMap<Subject,AbstractSubject> mSubjectDict;

    public static Broker getInstance()
    {
        return instance;
    }

    private Broker()
    {
        mSubjectDict=new HashMap<Subject,AbstractSubject>();
        mSubjectDict.put(Subject.Subj1,new Subject1());
        mSubjectDict.put(Subject.Subj2,new Subject2());
    }

    public AbstractLocationSubject getSubject(Subject subj)
    {
        return mSubjectDict.get(subj);
    }
}

新しい可能性のあるサブジェクトを追加するために必要なのは、Enum に値を追加し、mSubjectDict でサブジェクトを作成することだけです。全体として、私はこのソリューションに満足しています。

于 2013-10-16T01:44:34.050 に答える