设计模式----状态模式 实例
2015-06-23 14:02
260 查看
代码:
#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点了,先睡吧
#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点了,先睡吧
相关文章推荐
- VS2008在XP系统托盘气泡提示不成功解决办法
- 【iOS知识学习】_视图控制对象生命周期-init、viewDidLoad、viewWillAppear、viewDidAppear、viewWillDisappear等的区别及用途
- 如何查看php版本
- 15 3Sum(寻找三个数之和为指定数的集合Medium)
- linux grep命令使用的一些心得
- 64位开源处理器Rocket的源代码简单介绍
- CV各技术论坛及QQ群
- Android中的Interpolator
- QTPtest中Action种类
- Linux ALSA声卡驱动之四:Control设备的创建
- 第三个sprint冲刺第三阶段
- php 登陆后台验证代码
- Linux ALSA声卡驱动之三:PCM设备的创建
- 使用.bat文件运行ant的build.xml
- SynEdit(Delphi XE7)的安装和基本使用
- 第三个sprint冲刺第二阶段
- php 5.3 配置mssql笔记
- 那个革新的中国电信,是如何英雄气短
- Linux ALSA声卡驱动之二:声卡的创建
- 判断是什么浏览器