C++設計モードの状態モード
7435 ワード
// , , ,
#include<iostream>
using namespace std;
class State;
class Forenoon;
class Noon;
class Afternonn;
class Evening;
class GoHome;
class Work;
class State
{
public:
virtual void writeprogram(Work* w) = 0;
};
class Work
{
State* current;
public:
double hours;
bool finish;
Work();
void SetState(State* s)
{
current = s;
}
void WorkProgram()
{
current->writeprogram(this);
}
};
class Forenoon :public State
{
public:
void writeprogram(Work* w);
};
class Noon :public State
{
public:
void writeprogram(Work* w);
};
class Afternoon :public State
{
public:
void writeprogram(Work* w);
};
class Evening :public State
{
public:
void writeprogram(Work* w);
};
class GoHome :public State
{
public:
void writeprogram(Work* w)
{
cout << " :" << w->hours << " , " << endl;
}
};
Work::Work()
{
finish = false;
current = new Forenoon();
}
void Forenoon::writeprogram(Work* w)
{
if (w->hours < 12)
{
cout << " :" << w->hours << " , , " << endl;
}
else
{
w->SetState(new Noon());
w->WorkProgram();
}
}
void Noon::writeprogram(Work* w)
{
if (w->hours < 13)
{
cout << " :" << w->hours << " , , " << endl;
}
else
{
w->SetState(new Afternoon());
w->WorkProgram();
}
}
void Afternoon::writeprogram(Work* w)
{
if (w->hours < 17)
{
cout << " :" << w->hours << " , " << endl;
}
else
{
w->SetState(new Evening());
w->WorkProgram();
}
}
void Evening::writeprogram(Work* w)
{
if (w->finish)
{
w->SetState(new GoHome());
w->WorkProgram();
}
else
{
cout << " :" << w->hours << " , " << endl;
}
}
int main()
{
Work* work = new Work();
work->hours = 10;
work->WorkProgram();
work->hours = 12;
work->WorkProgram();
work->hours = 15;
work->WorkProgram();
work->finish = true;
work->hours = 18;
work->WorkProgram();
system("pause");
return 0;
}
実行結果:
:10 , ,
:12 , ,
:15 ,
:18 ,
. . .
このプログラムは論理的に不順であるが,状態関数の役割を表すことができ,基本構想は,状態インタフェースを定義し,状態インタフェースで状態遷移による変化,すなわちその虚関数を定義することである.オブジェクトWorkを定義し,Workにはいくつかの部分導入状態,状態遷移の判断条件関数,状態遷移の操作関数が含まれている.こんなもんだ