3

まず、状態オブジェクトにインスタンス変数がない場合に状態オブジェクトを共有する方法を誰か説明できますか?

このテキストは、GOF の 308 ページ、項目 3 (結果セクション) からの抜粋です。

状態オブジェクトは共有できます。状態オブジェクトにインスタンス variabkes がない場合、つまり、状態オブジェクトが表す状態がその型に完全にエンコードされている場合、コンテキストは状態オブジェクトを共有できます。状態がこのように共有される場合、それらは本質的にフライウェイトです。

このテキストを説明できる人はいますか?

第二に、状態遷移の決定へのアプローチは何ですか? 次のどの状態を伝播するかの決定を意味しますか?

助けてください。ありがとう。

4

2 に答える 2

2

この段落では、基本的に、状態を個別のクラスとしてエンコードすると述べています。インスタンスタイプは「状態」であり、クラスは必要なすべての情報をエンコードするため、クラスはインスタンス変数を必要としません。

たとえば、「オープン」、「アクティブ」、「クローズ」の3つの状態にしたいとします。私は次のクラスを定義するかもしれません:

abstract class State {};

class Open extends State {

  public Open() {}

}

class Active extends State {

  public Active() {}

}

class Closed extends State {

  public Closed() {}

}

-

別のオプション-これは、GOFテキストで示唆されているフライ級との組み合わせであると思われます。これは、一連の静的メンバー(各状態に1つ)を共有できる状態クラスを作成することです-

public class State {

  private string name;

  private State(String name) {
    this.name = name;
  }

  public final static State OPEN = new State("Open");
  public final static State ACTIVE = new State("Active");
  public final static State CLOSED = new State("Closed");

}

私はこれらすべてのものがどのように詳細に機能したかを思い出すために掘り下げなければなりませんでした。Kerievskyは、これについて(上記の例の1つから大いに借りてきました!)、各遷移を管理するクラスを作成するために、状態クラスからサブクラス化することによって状態遷移を処理する方法について説明しています。「パターンへのリファクタリング」(ISBN:0321213351)を参照してください。

EDIT(2):彼のWebサイトには、彼の例のクラス図があります-http://www.industriallogic.com/xp/refactoring/alteringConditionalsWithState.html

代替テキスト

于 2010-07-02T10:32:54.633 に答える
2

状態パターンでは、状態オブジェクトを使用してオブジェクトの状態を表現します。これらの状態オブジェクトは特定の状態を表しますが、独自の可変状態はありません。これは、それらが決して変わらないことを意味します。したがって、任意の数のオブジェクトが同時に同じ状態オブジェクトを使用できます (異なるスレッドからであっても)。状態オブジェクトに変更可能な状態がある場合、他のオブジェクトは、状態オブジェクトが他の場所から変更されることを心配する必要があります。

1 つのオブジェクト インスタンスを他の多くのインスタンスで使用することは、flyweight-patternのインスタンスと見なすことができます。

あなたの質問の2番目の部分については、ここに例があります:

class SomeStateMachine;

class AbstractState {
    // abstract baseclass for all state-classes
    void input(const std::string & data, SomeStateMachine & caller) = 0;
}

class FinalState : public AbstractState {
    FinalState * getInstance(); // always returns same instance
}

class InitialState : public AbstractState {
public:
    InitialState * getInstance(); // always returns same instance
    void input(const std::string & data, SomeStateMachine & caller) {
        std::cout << data << std::endl;
        caller.m_State = FinalState::getInstance();
    }
}

class SomeStateMachine {
public:
    SomeStateMachine() : m_State(InitialState::getInstance())
    void input(const std::string & data) {
        m_State->input(data, *this);
    }
private:
    friend class InitialState;
    AbstractState * m_State;
};

したがって、基本的に呼び出し元オブジェクトへの参照を状態オブジェクトのすべてのメソッドに渡します。このようにして、状態オブジェクトは必要に応じて呼び出し元の状態を変更できます。この例はあまり美しくないかもしれませんが、理解していただければ幸いです。

于 2010-07-06T07:54:42.710 に答える