LAN 経由で POS (Point of sale) 端末を制御するために使用される DLL を開発しています。
DLL は、次のような操作を実行するコマンドを提供します。
- ログオン
- ログオフ
- 認可
- カードデータの読み取り
- キャンセル
- 返金
- ネットワーク診断
また、DLL は Connect() および Disconnect() 関数を提供します。
POS 端末はさまざまな状態になる可能性があるため、State パターンは 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はどちらも有効と考えることができる 2 つの状態ですが、他の状態を判断する方法がわかりません。
PosAuthorisation、PosReadCardDataなどの状態を作成して、POS 関数に対応させることは理にかなっていますか? たぶん意味不明…
「進行中の現在のコマンド」と「現在の POS 状態」が混在しているため、状態パターンを正しく使用する方法について混乱しています。
おそらく、PosCommandInProgressのような状態が必要ですか?
アドバイスをいただければ幸いです。
どうもありがとう。