// 详细代码请从我的资源中下载
// 状态模式主要用来解决的是当控制一个对象转换的条件表达式过于复杂时的情况。
// 把状态的判断逻辑转移到表示不同状态的一系列类当中,可以把复杂的判断逻辑简化。
// 当然,如果这个状态判断很简单,那就没有变要使用“状态模式”了。
参照程杰的大话设计模式 写出 C++代码的 状态模式
// 无尽加班何时休 --- 状态模式 state Design Patterns
// author: wangjinfeng
// 每天12点之前, 上午工作,精神百倍
// 12点到13点, 饿了,午饭,犯困,午休
// 13点到17点, 状态不错,继续努力
// 到17点之后,如果工作做完了,就下班回家了,
// State.h
#pragma once
class CWork;
class CState
{
public:
virtual void WriteProgram( CWork *w)
{}
};
// work.h
#pragma once
#include "ForenoonState.h"
class CWork
{
public:
CWork();
int Hour;
bool bIsWorkFinshed;
CState *m_state;
void SetState(CState *s);
void Write();
};
// work.cpp
#include "stdafx.h"
#include "Work.h"
CWork::CWork()
{
CForenoonState *Aa = new CForenoonState() ;
m_state = Aa;
}
void CWork::Write()
{
m_state->WriteProgram(this);
}
void CWork::SetState(CState *s)
{
m_state = s;
}
// ForenoonState.h
pragma once
#include "State.h"
#include "Work.h"
class CForenoonState :public CState
{
public:
virtual void WriteProgram(CWork *w);
};
// ForenoonState.cpp
#include "stdafx.h"
#include "ForenoonState.h"
#include "NoonState.h"
#include <iostream>
using namespace std;
void CForenoonState::WriteProgram(CWork *w)
{
if (w->Hour < 12)
{
cout << "当前时间:" << w->Hour << "点"<<"上午工作,精神百倍" << endl;
}
else
{
CNoonState *pCNoSta = new CNoonState();
w->SetState( pCNoSta);
w->Write();
}
}
// NoonState.h
#include "stdafx.h"
#include "State.h"
class CNoonState:public CState
{
public:
virtual void WriteProgram(CWork *w);
};
// NoonState.cpp
#include "stdafx.h"
#include "NoonState.h"
#include "AfternoonState.h"
#include <iostream>
#include "Work.h"
using namespace std;
void CNoonState::WriteProgram(CWork *w)
{
if (w->Hour <13)
{
cout << "当前时间:" << w->Hour<< "点" << "饿了,午饭,犯困,午休" <<endl;
}
else
{
// CAfternoonState *pCAfterNoon = new CAfternoonState();
// w->SetState(pCAfterNoon);
// w->Write();
}
}
// 在客户端实现
int _tmain(int argc, _TCHAR* argv[])
{
CWork cA;
cA.Hour = 9;
cA.Write();
cA.Hour =12;
cA.Write();
//cA.Hour =15;
// cA.Write();
//cA.Hour =18;
//cA.Write();
//cA.Hour =23;
//cA.Write();
return 0;
}