设计模式----状态模式 实例

代码:


#include <iostream>      
using namespace std;  
 
class Work;  
 
/*状态接口State*/  
class State  
{  
public:  
    virtual void WriteProgram(Work *w) = 0;  
};  
 
//工作类  
class Work  
{  
private:  
    State *current;//当前状态  
    double hour;  
    bool taskFinish;  
      
      
public:  
    Work()  
    {  
        taskFinish = false;  
    }  
 
 
    void SetTime(double hour)  
    {  
        this->hour = hour;  
    }  
 
 
    double GetTime()  
    {  
        return this->hour;  
    }  
      
    //设置状态  
    void SetState(State *s)  
    {  
        current = s;  
    }  
      
    //设置工程是否完成  
    void SetFinish()  
    {  
        taskFinish = true;  
    }  
 
    bool GetFinish()  
    {  
        return taskFinish;  
    }  
        
    void WriteProgram()  
    {  
        current->WriteProgram(this);  
    }  
      
};  
 
//下班休息状态  
class RestState : public State  
{  
public:  
    void WriteProgram(Work *w)  
    {  
        cout<<"当前时间:"<<w->GetTime()<<"点 工作完成,下班回家了"<<endl;  
    }        
};  
 
//睡眠工作状态  
class SleepingState : public State  
{  
public:  
    void WriteProgram(Work *w)  
    {  
        cout<<"受不了了,"<<w->GetTime()<<"点了,先睡吧"<<endl;  
    }  
};  

//晚上工作状态  
class EveningState : public State  
{  
public:  
    void WriteProgram(Work *w)  
    {  
        //任务完成了,可以休息了  
        if(w->GetFinish())  
        {  
            w->SetState(new RestState());  
            w->WriteProgram();  
        }else  
        {  
            if(w->GetTime()<21){  
                cout<<"当前时间:"<<w->GetTime()<<"点 加班了,疲惫至极"<<endl;  
            }else  
            {  
                //找过21点  
                w->SetState(new SleepingState());  
                w->WriteProgram();  
            }  
        }  
    }  
};  
 
//下午工作状态  
class AfternoonState : public State  
{  
      
public:  
    void WriteProgram(Work *w)  
    {  
        if(w->GetTime()<17)  
        {  
            cout<<"当前时间:"<<w->GetTime()<<"点 状态还不错,继续努力"<<endl;  
        }else  
        {  
            w->SetState(new EveningState());  
            w->WriteProgram();  
        }  
    }  
};  
 
//中午工作状态  
class NoonState : public State  
{  
public:  
    void WriteProgram(Work *w)  
    {  
        if (w->GetTime()<13)  
            cout<<"当前时间:"<<w->GetTime()<<"点 饿了,午饭:犯困,午休"<<endl;  
        else  
        {  
            w->SetState(new AfternoonState());  
            w->WriteProgram();  
        }  
    }  
};  
      
//上午工作状态  
class ForenoonState : public State  
{  
public:  
    void WriteProgram(Work *w)  
    {  
        if(w->GetTime()<12)  
            cout<<"当前时间:"<<w->GetTime()<<"点 上午工作,精神百倍"<<endl;  
        else  
        {  
            w->SetState(new NoonState());  
            w->WriteProgram();  
        }  
    }   
};  
 
int main()  
{  
    //紧急项目  
    Work *emergencyProjects = new Work();  
    emergencyProjects->SetState(new ForenoonState());  
    emergencyProjects->SetTime(9);   
    emergencyProjects->WriteProgram();  

    emergencyProjects->SetTime(10);  
    emergencyProjects->WriteProgram();  
 
    emergencyProjects->SetTime(12);  
    emergencyProjects->WriteProgram();  

    emergencyProjects->SetTime(14);  
    emergencyProjects->WriteProgram();  
 
    //完成工作,不需要再加班了  
    //emergencyProjects->SetFinish();  

    emergencyProjects->SetTime(19);  
    emergencyProjects->WriteProgram();  
 
    emergencyProjects->SetTime(22);  
    emergencyProjects->WriteProgram();  

      return 0;
}


编译&运行结果:

ngnsvr9 [** NONE **]/home/xionghailong/demo/state $ g++ main.cpp -o main
ngnsvr9 [** NONE **]/home/xionghailong/demo/state $ ./main
当前时间:9点 上午工作,精神百倍
当前时间:10点 上午工作,精神百倍
当前时间:12点 饿了,午饭:犯困,午休
当前时间:14点 状态还不错,继续努力
当前时间:19点 加班了,疲惫至极
受不了了,22点了,先睡吧

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值