6.模式的组成
环境类(Context):
定义客户感兴趣的接口。维护一个ConcreteState子类的实例,这个实例定义当前状态。
抽象状态类(State):定义一个接口以封装与Context的一个特定状态相关的行为。
具体状态类(ConcreteState):每一子类实现一个与Context的一个状态相关的行为。
7. 实例
允许一个对象在其内部状态改变时改变它的行为。对象看起来似乎修改了它的类。
main(),客户
CLiftState,电梯状态抽象类
CCloseingState,电梯门关闭
COpenningState,电梯门打开
CRunningState,电梯运行
CStoppingState,电梯停止
CContext,电梯的控制面板
说明:CContext保持电梯的状态,并提供操作的接口函数。当函数被调用时,CContext直接调用当前状态的相应函数。由状态的接口函数来确定是否可以执行这个动作,以及修改状态为执行这个动作后的状态。
看代码:第一块是不使用模式的做法,第二块是使用模式的做法,在main()函数里会有调用的方式。
//ILift.h
#pragma once
class ILift
{
public:
ILift(void)
{
}
virtual
~ILift(void)
{
}
static
const int OPENING_STATE = 1;
static
const int CLOSING_STATE = 2;
static
const int RUNNING_STATE = 3;
static
const int STOPPING_STATE = 4;
virtual
void SetState(int state) = 0;
virtual
void Open() = 0;
virtual
void Close() = 0;
virtual
void Run() = 0;
virtual
void Stop() = 0;
};
//Lift.h
#pragma once
#include "ilift.h"
class CLift :
public
ILift
{
public:
CLift(void);
~CLift(void);
void
SetState(int state);
void
Open();
void
Close();
void
Run();
void
Stop();
private:
int
m_state;
void
OpenWithoutLogic();
void
CloseWithoutLogic();
void
RunWithoutLogic();
void
StopWithoutLogic();
};
//Lift.cpp
#include "StdAfx.h"
#include "Lift.h"
#include
using std::cout;
using std::endl;
CLift::CLift(void)
{
this->m_state = 0;
}
CLift::~CLift(void)
{
}
void CLift::SetState(int
state)
{
this->m_state = state;
}
void CLift::Open()
{
switch(this->m_state)
{
case
OPENING_STATE:
break;
case
CLOSING_STATE:
this->OpenWithoutLogic();
this->SetState(OPENING_STATE);
break;
case
RUNNING_STATE:
break;
case
STOPPING_STATE:
this->OpenWithoutLogic();
this->SetState(OPENING_STATE);
break;
}
}
void CLift::Close()
{
<