2012-12-08 10 views
7

In der Netzwerkprogrammierung gibt es Szenarios, in denen State Machines mit mehreren und hierarchischen Tiefen benötigt werden.Entwurf für Multilevel- und hierarchische Statusmaschinen

State Machine 1 
    State Machine 2 

    State Machine 3 
      State Machine 4 

Hier State Machine 1 enthält zwei Zustandsmaschinen 2 und 3. 3 enthält auch eine Maschine 4.

Basierend auf dem Zustand der äußeren Maschine sollte die Nachricht durch die inneren Zustandsmaschinen passieren. Auch wenn es einen Fehler in den inneren Zustandsmaschinen gibt, sollte die Rückmeldung an die oberen Maschinen gegeben werden.

Gibt es einen guten Ansatz, dies zu tun?

Im Moment habe ich einen Dschungel von if-Statements und Flags, die das für mich tun. Ich stehe weiterhin vor Problemen, dass ein Flag nicht gesetzt ist, aufgrund dessen der gesamte Zustand der Zustandsmaschine in einen nicht wiederherstellbaren Zustand gerät.

UPDATE: Ich versuche, die Zustände und die Maschine statisch zu halten. Wenn die Anfrage die Maschinen und Zustände durchläuft, speichert die Anfrage selbst alle benötigten Metadaten. In diesem Fall hilft das normale State Machine-Muster nicht.

Antwort

0

State Pattern zu trennen Zustand und Kontext. Kontext kann die Hierarchie der Status speichern, und Statusunterklassen kennen diese Hierarchie nicht. Alle if-Anweisungen sind weg, weil jeder Abschnitt unter if in eine separate state-Unterklasse geht.

+0

Ich habe versucht, State zu verwenden, aber scheint nicht für ein solches Design zu arbeiten. Eigentlich schaltet mein Programmablauf auch zwischen den Maschinen hin und her. Wie bei einer Veranstaltung bin ich in der inneren Maschine, aber für die nächste Veranstaltung muss ich in der äußeren Maschine sein. Und das schafft ein großes Problem. –

+0

Sie sollten das GOF Buch über Design Patterns lesen. Das Implementieren von Zustandsübergängen, über die Sie sprechen, wird im Abschnitt Implementierung behandelt. Ich werde es für Sie zusammenfassen: Zustandsübergänge können vollständig in Context oder in State-Unterklassen implementiert werden. Sie sollten auswählen, wo Sie implementieren möchten, indem Sie Fragen stellen wie: Sind die Anzahl der Staaten festgelegt oder werden weitere hinzugefügt? – user1168577

6

Vielleicht kann Android-Quellcode nützlich sein, um zu verstehen, wie dies zu tun ist? Überprüfen Sie WiFi state machine here ..

+0

Dank es half mir etwas Klarheit. –

+0

Gern geschehen. Ich habe in letzter Zeit dasselbe Problem, also habe ich kürzlich gelesen. Hoffentlich finden andere es auch nützlich;) – Ewoks