我正在开发一个 DLL,用于通过 LAN 控制 POS(销售点)终端。
DLL 提供了执行以下操作的命令:
- 登录
- 注销
- 授权
- 读卡数据
- 消除
- 退款
- 网络诊断
DLL 还提供 Connect() 和 Disconnect() 函数。
由于 POS 终端可以处于各种状态,我认为状态模式可能会在 DLL 中使用。
伪代码:
// My DLL
class Pos
{
public:
Pos();
~Pos();
bool Connect();
bool Disconnect();
bool DoLogon() { m_pCurrentPosState->DoLogon(this); }
bool DoLogoff() { m_pCurrentPosState->DoLogoff(this); }
bool DoAuthorisation() { m_pCurrentPosState->DoAuthorisation(this); }
bool DoReadCardData() { m_pCurrentPosState->DoReadCardData(this); }
bool DoCancellation() { m_pCurrentPosState->DoCancellation(this); }
bool DoRefund() { m_pCurrentPosState->DoRefund(this); }
bool DoNetworkDiagnosis() { m_pCurrentPosState->DoNetworkDiagnosis(this); }
...
private:
void ChangeState(PosState *pPosState) { m_pCurrentPosState = pPosState; }
private:
friend class PosState;
PosState *m_pCurrentPosState;
...
};
class PosState
{
public:
// Implement default behavior for all command requests.
virtual bool DoLogon(Pos *pPos) {}
virtual bool DoLogoff(Pos *pPos) {}
virtual bool DoAuthorisation(Pos *pPos) {}
virtual bool DoReadCardData(Pos *pPos) {}
virtual bool DoCancellation(Pos *pPos) {}
virtual bool DoRefund(Pos *pPos) {}
virtual bool DoNetworkDiagnosis(Pos *pPos) {}
protected:
void ChangeState(Pos *pPos, PosState *pPosState);
};
class PosLoggedon : public PosState
{
public:
static PosState* Instance();
// Implement state-specific behavior.
bool DoLogoff(Pos *pPos);
bool DoAuthorisation(Pos *pPos);
bool DoReadCardData(Pos *pPos);
bool DoCancellation(Pos *pPos);
bool DoRefund(Pos *pPos);
bool DoNetworkDiagnosis(Pos *pPos);
};
class PosLoggedoff : public PosState
{
public:
static PosState* Instance();
// Implement state-specific behavior.
bool DoLogon(Pos *pPos);
bool DoAuthorisation(Pos *pPos);
bool DoReadCardData(Pos *pPos);
bool DoCancellation(Pos *pPos);
bool DoRefund(Pos *pPos);
bool DoNetworkDiagnosis(Pos *pPos);
};
PosLoggedon和PosLoggedoff都是我认为有效的两个状态,但我不确定如何确定其他状态。
创建像PosAuthorisation、PosReadCardData等状态以便它们对应于 POS 函数是否有意义?大概没有意义吧……
我对如何正确使用状态模式感到困惑,因为我正在混合“当前命令进行中”和“当前 POS 状态”。
也许我需要像PosCommandInProgress这样的状态?
任何意见,将不胜感激。
非常感谢。