我正在開發一個用於通過局域網控制POS(銷售點)終端的DLL。如何確定狀態模式
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?
任何意見,將不勝感激。
非常感謝。
@羅馬 - 我不太清楚你的意思是「不適用重新實現虛擬成員拋出錯誤,而如果(狀態== XX)......否則,如果(狀態== YY)」。你能給我更多的信息嗎?乾杯。 – jpen 2012-07-31 10:36:44
好的,編輯我的帖子添加一些例子 – 2012-07-31 10:50:42
哦,我明白了。很好的樣本,哈哈! – jpen 2012-07-31 10:59:10