[C++設計モード]state状態モード


「head firstデザインモデル」の例はとても良くて、自動取引のキャンディ機を作りたいです.キャンディ機には4つの状態があります.投入金が不足して、投入金が十分で、キャンディを売って、キャンディが売り切れています.キャンディマシンの現在の状態が異なる場合、同じ操作に対する反映動作も異なる.従来のプロセス向けプログラミングはif-elseを用いて異なる状態で別々に処理され、論理的に面倒で拡張性がない.
≪ステータス・モード|Status Mode|emdw≫:オブジェクトが内部のステータスが変更されたときに動作を変更できるようにします.オブジェクトはクラスを変更したように見えます.状態モードの重点は状態変換にあり、多くの場合、1つのオブジェクトの状態に対して、私たちはこのオブジェクトに1つの状態の属性を含ませて、この状態の属性はオブジェクトの具体的な状態を記録して、状態の違いによって分岐構造を使って異なる仕事エネルギーを実行して、上のコードのように処理します;前述したように,クラスには構造的に類似した分岐文が大量に存在し,メンテナンスと理解が困難になる.ステータスモードはブランチ文を除去し、ファクトリモードが単純なファクトリモードのブランチ文を除去するように、ステータス処理を各ステータスサブクラスに分散し、各サブクラスは1つのステータスを集中的に処理し、ステータスの処理と変換を明確にする.
Stateクラス、抽象状態クラス、インタフェースを定義してContextの特定の状態に関連する動作をカプセル化します.ConcreteStateクラス、特定のステータス、各サブクラスはContextのステータスに関連する動作を実現します.Contextクラス、現在のステータスを定義するConcreteStateサブクラスのインスタンスを維持します.
フレームワークを与えて、実現しないで、比較的に理解しやすいです.

class Context;
class State
{
public:
    virtual void Handle(Context* pContext)=0;
    ~State();
protected:
    State();
private:
};

class ConcreteStateA : public State
{
public:
    ConcreteStateA();
    ~ConcreteStateA();
    virtual void Handle(Context* pContext);
protected:
private:
};

class ConcreteStateB : public State
{
public:
    ConcreteStateB();
    ~ConcreteStateB();
    virtual void Handle(Context* pContext);
protected:
private:
};

class ConcreteStateC : public State
{
public:
    ConcreteStateC();
    ~ConcreteStateC();
    virtual void Handle(Context* pContext);
protected:
private:
};

class Context
{
public:
    Context(State* pState);
    ~Context();
    void Request();
    void ChangeState(State* pState);
protected:
private:
    State* _state;
};