2016-12-16 10 views
0

私はかなり複雑なステートマシンを持っていますが、私はいくつかの状態を1つに組み合わせることで簡単にInterfaceを提供したいと考えています。StateMachineの削減のためのデザインパターン

以下の解決策で私の問題は、インターフェイスにも存在するいくつかの状態を共有する2つの列挙体のためにコードの重複があることです。

誰も私にデザインパターンのヒントを教えてもらえますか?

#include <iostream> 
using namespace std; 

enum State { state0, state1, state2, state3, state4, state5 }; 
enum SimpleState { simple_state0, // <-- Duplication 
       simple_state1, // <-- Duplication 
       simple_state2, // <-- Duplication 
       simple_state3, // <-- Duplication 
       stateSimple }; // < state4 or state5 

class ComplexStateMachine 
{ 
public: 
    State s_; 

    State getState() 
    { 
     return s_; 
    }; 
}; 


class SimpleInterface 
{ 
public: 
    SimpleInterface(ComplexStateMachine* c) 
    { 
     this->complex_ = c; 
    }; 

    SimpleState getSimpleState() 
    { 
     switch(this->complex_->getState()) 
     { 
      case state0: 
       return simple_state0; 
      case state1: 
       return simple_state1; 
      case state2: 
       return simple_state2; 
      case state3: 
       return simple_state3; 
      case state4: 
      case state5: 
       return stateSimple; 
     } 

    }; 

private: 
    ComplexStateMachine* complex_; 
}; 

int main() { 

// Generate complex state machine 
ComplexStateMachine* csm = new ComplexStateMachine(); 
csm->s_ = state0; 

// Generate simple interface 
SimpleInterface si(csm); 
si.getSimpleState(); // <-- Should now return the simplified state 

return 0; 
} 

答えて

0

「単純化」とは、1つの単純な状態から複数の複雑な状態へのマッピングです。 1対1マッピングが存在する場合、単純化はなく、重複のみが存在する。あなたのシンプルな例では、重複がありますので、facadeを作成する必要はありません。

単純なステートマシンが実際にはより複雑な状態をカプセル化する場合は、利益が大きくなり、複製が小さくなります。それは場合に役立ちます

また、あなたが自分自身で複雑さを隠すために他のステートマシンを含んでいること、の状態と同じように、あなたのステートマシンをモデル化しようとする場合があります。

Complex state

+0

私は実際に使用したいですStateMachine自体はハードウェアの後ろに本当に意味を持っているので、インタフェースを変更する必要はなく、ファサードなどで作業します。 – alex

+0

それだけでそれを追加し、ファサードで必要なメソッドの分析を行い、クラスを使用するという観点からそれを定式化して、重複した状態を必要としないようにします。例えばおそらくこのような小さなインタフェース: bool HasFinished();値GetResult(); で十分です – PsiX

関連する問題