設計モードC++実装(16)状態モード
2821 ワード
ソフトウェア分野の設計モデルは、開発者に専門家の設計経験を使用する有効な方法を提供します.設計モードの中で対象向けプログラミング言語の重要な特性を運用した:パッケージ、継承、多態、本当に設計モードの精髄を悟るのは1つの長い過程であり、大量の実践経験の蓄積が必要である.最近デザインモードの本を読んで、各モードについて、C++で小さな例を書いて、理解を深めました.主に『大話設計モード』と『設計モード:オブジェクト向けソフトウェアを多重化できる基礎』の2冊を参考にします.本稿では,状態モードの実装について述べる.
≪ステータス・モード|Status Mode|emdw≫:オブジェクトが内部のステータスが変更されたときに動作を変更できるようにします.オブジェクトはクラスを変更したように見えます.(1)1つのオブジェクトの動作はその状態に依存し、実行時に状態に応じて動作を変更する必要があります.(2)1つの動作には膨大な複数のブランチの条件文が含まれており、これらのブランチはそのオブジェクトの状態に依存する.本文の例は第1の情況で、戦争を例にして、1度の戦争が4つの段階を経験する必要があると仮定します:前期、中期、後期、終わり.戦争が異なる段階にあると、戦争の行為は異なり、つまり戦争の行為は置かれている段階に依存し、時間の推進に伴って動的に変化するという.次に、対応するUML図を示す.
http://blog.csdn.net/wuzhekai1985/article/details/6675799
実装されるコードは比較的簡単で,WarクラスとStateクラスを与え,WarクラスにはStateオブジェクト(ポインタ形式)が含まれている.
≪ステータス・モード|Status Mode|emdw≫:オブジェクトが内部のステータスが変更されたときに動作を変更できるようにします.オブジェクトはクラスを変更したように見えます.(1)1つのオブジェクトの動作はその状態に依存し、実行時に状態に応じて動作を変更する必要があります.(2)1つの動作には膨大な複数のブランチの条件文が含まれており、これらのブランチはそのオブジェクトの状態に依存する.本文の例は第1の情況で、戦争を例にして、1度の戦争が4つの段階を経験する必要があると仮定します:前期、中期、後期、終わり.戦争が異なる段階にあると、戦争の行為は異なり、つまり戦争の行為は置かれている段階に依存し、時間の推進に伴って動的に変化するという.次に、対応するUML図を示す.
http://blog.csdn.net/wuzhekai1985/article/details/6675799
実装されるコードは比較的簡単で,WarクラスとStateクラスを与え,WarクラスにはStateオブジェクト(ポインタ形式)が含まれている.
class War;
class State
{
public:
virtual void Prophase() {}
virtual void Metaphase() {}
virtual void Anaphase() {}
virtual void End() {}
virtual void CurrentState(War *war) {}
};
//
class War
{
private:
State *m_state; //
int m_days; //
public:
War(State *state): m_state(state), m_days(0) {}
~War() { delete m_state; }
int GetDays() { return m_days; }
void SetDays(int days) { m_days = days; }
void SetState(State *state) { delete m_state; m_state = state; }
void GetState() { m_state->CurrentState(this); }
};
//
class EndState: public State
{
public:
void End(War *war) //
{
cout<<" "<<endl;
}
void CurrentState(War *war) { End(war); }
};
//
class AnaphaseState: public State
{
public:
void Anaphase(War *war) //
{
if(war->GetDays() < 30)
cout<<" "<<war->GetDays()<<" : , "<<endl;
else
{
war->SetState(new EndState());
war->GetState();
}
}
void CurrentState(War *war) { Anaphase(war); }
};
//
class MetaphaseState: public State
{
public:
void Metaphase(War *war) //
{
if(war->GetDays() < 20)
cout<<" "<<war->GetDays()<<" : , , "<<endl;
else
{
war->SetState(new AnaphaseState());
war->GetState();
}
}
void CurrentState(War *war) { Metaphase(war); }
};
//
class ProphaseState: public State
{
public:
void Prophase(War *war) //
{
if(war->GetDays() < 10)
cout<<" "<<war->GetDays()<<" : , , "<<endl;
else
{
war->SetState(new MetaphaseState());
war->GetState();
}
}
void CurrentState(War *war) { Prophase(war); }
};
//
int main()
{
War *war = new War(new ProphaseState());
for(int i = 1; i < 40;i += 5)
{
war->SetDays(i);
war->GetState();
}
delete war;
return 0;
}