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にはいくつかの部分導入状態,状態遷移の判断条件関数,状態遷移の操作関数が含まれている.こんなもんだ