Staatsmuster

Das Zustandmuster, das nah Strategie-Muster ähnelt, ist ein Verhaltenssoftwaredesignmuster, auch bekannt als die Gegenstände für das Zustandmuster. Dieses Muster wird in der Computerprogrammierung verwendet, um den Staat eines Gegenstands zu vertreten. Das ist ein sauberer Weg für einen Gegenstand, seinen Typ an der Durchlaufzeit teilweise zu ändern.

Struktur

Beispiel

Pseudocode

Nehmen Sie zum Beispiel, ein Zeichnungsprogramm. Das Programm hat einen Maus-Cursor, der an jedem Punkt rechtzeitig als eines von mehreren Werkzeugen handeln kann. Anstatt zwischen vielfachen Cursor-Gegenständen umzuschalten, erhält der Cursor einen inneren Staat aufrecht, der das Werkzeug zurzeit im Gebrauch vertritt. Wenn eine vom Werkzeug abhängige Methode genannt wird (sagen Sie infolge eines Maus-Klicks), der Methode-Anruf wird zum Staat des Cursors verzichtet.

Jedes Werkzeug entspricht einem Staat. Die geteilte abstrakte Zustandklasse ist AbstractTool:

Klasse AbstractTool ist

fungieren Sie moveTo (Punkt) ist

Eingang: Der Positionspunkt die Maus hat sich zu bewegt

(diese Funktion muss durch Unterklassen durchgeführt werden)

fungieren Sie mouseDown (Punkt) ist

Eingang: Der Positionspunkt die Maus ist an

(diese Funktion muss durch Unterklassen durchgeführt werden)

fungieren Sie mouseUp (Punkt) ist

Eingang: Der Positionspunkt die Maus ist an (diese Funktion muss durch Unterklassen durchgeführt werden)

Gemäß dieser Definition muss jedes Werkzeug Bewegung des Maus-Cursors und auch des Anfangs und Ende jedes Klicks oder Schinderei behandeln.

Mit dieser Grundklasse konnten einfacher Kugelschreiber und Auswahl-Werkzeuge wie das aussehen:

Unterklasse PenTool von AbstractTool ist

last_mouse_position: = ungültiger

mouse_button: =

fungieren Sie moveTo (Punkt) ist Eingang: Der Positionspunkt die Maus hat sich zu bewegt

wenn mouse_button = unten

(ziehen Sie eine Linie vom last_mouse_position, um hinzuweisen)

,

last_mouse_position: = spitzen an

fungieren Sie mouseDown (Punkt) ist Eingang: Der Positionspunkt die Maus ist an

mouse_button: = unten

last_mouse_position: = spitzen an

fungieren Sie mouseUp (Punkt) ist Eingang: Der Positionspunkt die Maus ist an

mouse_button: =

Unterklasse SelectionTool von AbstractTool ist

selection_start: = ungültiger

mouse_button: = fungieren Sie moveTo (Punkt) ist Eingang: Der Positionspunkt die Maus hat sich zu bewegt wenn mouse_button = unten

(wählen Sie das Rechteck zwischen selection_start und Punkt aus)

fungieren Sie mouseDown (Punkt) ist Eingang: Der Positionspunkt die Maus ist an mouse_button: = unten

selection_start: = spitzen an

fungieren Sie mouseUp (Punkt) ist Eingang: Der Positionspunkt die Maus ist an mouse_button: =

Für dieses Beispiel wird die Klasse für den Zusammenhang Cursor genannt. Die Methoden, die in der abstrakten Zustandklasse genannt sind

(AbstractTool in diesem Fall) werden auch im Zusammenhang durchgeführt. In der Zusammenhang-Klasse rufen diese Methoden die entsprechende Methode des aktuellen Staates an, der durch current_tool vertreten ist.

Klassencursor ist

current_tool: = neuer PenTool

fungieren Sie moveTo (Punkt) ist Eingang: Der Positionspunkt die Maus hat sich zu bewegt

current_tool.moveTo (Punkt)

fungieren Sie mouseDown (Punkt) ist Eingang: Der Positionspunkt die Maus ist an

current_tool.mouseDown (Punkt)

fungieren Sie mouseUp (Punkt) ist Eingang: Der Positionspunkt die Maus ist an

current_tool.mouseUp (Punkt)

fungieren Sie usePenTool ist

current_tool: = neuer PenTool

fungieren Sie useSelectionTool ist

current_tool: = neuer SelectionTool

Bemerken Sie, wie ein Cursor-Gegenstand handeln kann, sowohl weil PenTool als auch SelectionTool an verschiedenen Punkten, durch den Übergang der passenden Methode dazu auffordern, welch auch immer Werkzeug aktiv ist. Das ist die Essenz des Zustandmusters. In diesem Fall könnten wir Staat und Gegenstand verbunden haben, indem wir Klassen von PenCursor und SelectCursor so geschaffen haben, die Lösung des einfachen Erbes reduzierend, aber in der Praxis kann Cursor Daten tragen, der teuer oder unelegant ist, um zu einem neuen Gegenstand zu kopieren, wann auch immer ein neues Werkzeug ausgewählt wird.

Java

Die Zustandschnittstelle und zwei Durchführungen. Die Methode des Staates hat eine Verweisung auf den Zusammenhang-Gegenstand und ist im Stande, seinen Staat zu ändern.

verbinden Sie den Staat {\

Leere writeName (StateContext stateContext, Schnur-Name);

}\

Klasse StateA führt den Staat {\durch

öffentliche Leere writeName (StateContext stateContext, Schnur-Name) {\

System.out.println (name.toLowerCase );

stateContext.setState (neuer StateB );

}\}\

Klasse StateB führt den Staat {\durch

private interne Nummer count=0;

öffentliche Leere writeName (StateContext stateContext, Schnur-Name) {\

System.out.println (name.toUpperCase );

//ändern Sie Staat, nachdem der writeName von StateB zweimal angerufen wird

wenn (++ Zählung> 1) {\

stateContext.setState (neuer StateA );

}\

}\}\</Quelle>

Die Zusammenhang-Klasse hat eine Zustandsgröße, die sie in einem anfänglichen Staat, in diesem Fall StateA realisiert. In seiner Methode verwendet es die entsprechenden Methoden des Zustandgegenstands.

öffentliche Klasse StateContext {\

privater Staat myState;

öffentlicher StateContext {\

setState (neuer StateA );

}\

//normalerweise nur genannt durch Klassen, die die Staatsschnittstelle durchführen

öffentliche Leere setState (Staat newState) {\

this.myState = newState;

}\

öffentliche Leere writeName (Schnur-Name) {\

this.myState.writeName (das, Name);

}\}\</Quelle>

Und der Gebrauch:

öffentliche Klasse TestClientState {\

öffentliche statische leere Hauptsache (Schnur [] args) {\

StateContext sc = neuer StateContext ;

sc.writeName ("Montag");

sc.writeName ("Dienstag");

sc.writeName ("Mittwoch");

sc.writeName ("Donnerstag");

sc.writeName ("Samstag");

sc.writeName ("Sonntag");

}\}\</Quelle>

Gemäß dem obengenannten Code sollte die Produktion von wichtigen von TestClientState sein:

am Montag

AM DIENSTAG

AM MITTWOCH

am Donnerstag

AM SAMSTAG

AM SONNTAG

</Quelle>

Siehe auch

Links


Beobachter-Muster / Strategie-Muster
Impressum & Datenschutz