设计模式学习—State(状态机)
意图:允许一个对象在其状态改变时,改变它的行为。看起来对象似乎修改了它的类。
适用性:
1、一个对象的行为取决于它的状态,并且它必须在运行过程中可以根据它的状态改变它的行为;
2、一个操作中含有庞大的多分支的条件语句,并且这些分支依赖于该对象的状态;这个状态通常使用一个或多个枚举常量表示;通常,有多个操作包含这一相同的条件结构;State模式把每一个条件分支放入一个独立的类中;这使得你可以根据对象自身的情况把对象的状态作为一个对象,而且这一对象可以不依赖于其它对象而独立变化;
示例图:
示例代码:
//具体机器类行为的对象
//根据状态不同执行不同的内容
class CMachine
{
friend class CMachineState;
public:
CMachine();
public:
~CMachine(void);
public:
void Run();
public:
void SetState(CMachineState* pstate);
public:
void ChangeState(CMachineState* pstate);//CMachineState* pState);
private:
CMachineState* m_pState;
};
//具体状态类 初始化状态
void CMachineInitlizeState::Do(CMachine* pMachine)
{
_tprintf(_T("Mahchine is inited\n"));
//切换到运行状态
pMachine->ChangeState(new CMachineRunningState());
}
//运行状态类
void CMachineRunningState::Do(CMachine* pMachine)
{
_tprintf(_T("Mahchine is running\n"));
}
适用性:
1、一个对象的行为取决于它的状态,并且它必须在运行过程中可以根据它的状态改变它的行为;
2、一个操作中含有庞大的多分支的条件语句,并且这些分支依赖于该对象的状态;这个状态通常使用一个或多个枚举常量表示;通常,有多个操作包含这一相同的条件结构;State模式把每一个条件分支放入一个独立的类中;这使得你可以根据对象自身的情况把对象的状态作为一个对象,而且这一对象可以不依赖于其它对象而独立变化;
示例图:
示例代码:
//具体机器类行为的对象
//根据状态不同执行不同的内容
class CMachine
{
friend class CMachineState;
public:
CMachine();
public:
~CMachine(void);
public:
void Run();
public:
void SetState(CMachineState* pstate);
public:
void ChangeState(CMachineState* pstate);//CMachineState* pState);
private:
CMachineState* m_pState;
};
//具体状态类 初始化状态
void CMachineInitlizeState::Do(CMachine* pMachine)
{
_tprintf(_T("Mahchine is inited\n"));
//切换到运行状态
pMachine->ChangeState(new CMachineRunningState());
}
//运行状态类
void CMachineRunningState::Do(CMachine* pMachine)
{
_tprintf(_T("Mahchine is running\n"));
}