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