私は以下に説明するようなステートマシンを持っています。
2つの開始状態のいずれかで開始できますが、ハンドシェイクの4つの状態すべてをヒットする必要があります。そこから、データのペイロードを転送するか、データのペイロードを受信することができます。その後、元の開始状態に戻ります。
ハンドシェーク:
-> StartedState1-> FinalState1-> StartedState2-> FinalState2
-> StartedState2-> FinalState2-> StartedState1-> FinalState1
ペイロード転送:
-> SendPayload-> SendEnd-> StartedState?
-> ReceivePayload-> ReceiveEnd-> StartedState?
以下のコードは、私の現在のアーキテクチャを表しています。残念ながら、各プロセスの最後に、州内から次の州が何を打つべきかを知るのに十分な情報がありません。
私の要件に基づいてこのアーキテクチャを改善する方法について誰か提案がありますか?
ありがとう、PaulH
class MyMachine;
class Payload;
class IState
{
MyMachine* context_;
IState( MyMachine* context ) : context_( context) {};
virtual void Consume( byte data );
void ChangeState( IState* state )
{
context_->SetState( state );
}
}
class FinalState1 : IState
{
void Consume( byte data )
{
// Either go to StartingState1, SendPayload, or ReceivePayload.
// How can I tell from within the context of this state where I
// should go?
}
}
class StartingState1 : IState
{
void Consume( byte data )
{
if ( /*some condition*/ )
{
ChangeState( new FinalState1( context_ ) );
}
}
}
class MyMachine
{
IState* state_;
Payload* payload_;
void Start1( Mode mode )
{
state_ = new StartingState1( this );
}
void Start2( Mode mode )
{
state_ = new StartingState2( this );
}
void Consume( byte data )
{
state_->Consume( data );
}
void SetPayload( const Payload* payload )
{
payload_ = payload;
}
const Payload* GetPayload()
{
return payload_;
}
void SetState( State* state )
{
delete state_;
state_ = state;
}
}
// get a byte of data from some source
byte GetData();
void main()
{
MyMachine machine;
Payload payload;
machine.SetPayload( payload );
machine.Start1( Mode::SendPayload );
// could also call:
// machine.Start1( Mode::ReceivePayload );
// machine.Start2( Mode::SendPayload );
// machine.Start2( Mode::ReceivePayload );
for(;;)
{
machine.Consume( GetData() );
}
}