Der Zustand (engl. State) ist ein Entwurfsmuster aus dem Bereich der Softwareentwicklung und gehört zu der Kategorie der Verhaltensmuster (Behavioral Patterns). Das Zustandsmuster wird verwendet, um Änderungen des Verhaltens eines Objekts abhängig von seinem Zustand zu ermöglichen.
Das Zustandsmuster ist eines der so genannten GoF-Muster. Auch bekannt als Objekte für Zustände (Objects for States).
Inhaltsverzeichnis |
Für ein Objekt sind verschiedene Zustände, die möglichen Übergänge zwischen diesen Zuständen und das davon abhängige Verhalten zu definieren. Dies ist hier in Form eines endlichen Automaten dargestellt. Dabei zeigt der schwarze Kreis auf den Startzustand und der schwarze Kreis mit der weißen Umrandung auf den Endzustand. Die gerichteten Kanten (Pfeile) zwischen den Zuständen Closed, Open und Deleted definieren den Zustandswechsel.
Ein einzelner Zustand eines Objektes kann wiederum in eine Anzahl verschiedener Zustände aufgeteilt werden. Den Zustand Open kann man beispielsweise unterteilen in Read und Wrote. Sie bilden einen zusammengesetzten Zustand Open. Closed sowie Deleted betrachtet man unabhängig vom zusammengesetzten Zustand Open. Diese Zustände kann man in einer Hierarchie anordnen. Open, Closed und Deleted sind in der ersten Ebene. In der zweiten Ebene befinden sich Read und Wrote, die dem Zustand Open zugeordnet sind.
Das zustandsabhängige Verhalten des Objekts wird in separate Klassen ausgelagert, wobei für jeden möglichen Zustand eine eigene Klasse eingeführt wird, die das Verhalten des Objekts in diesem Zustand definiert. Damit das ursprüngliche Objekt die separaten Zustandsklassen einheitlich behandeln kann, wird eine gemeinsame Abstrahierung dieser Klassen definiert. Bei einem Zustandsübergang tauscht das ursprüngliche Objekt das von ihm verwendete Zustandsobjekt aus.
Für das Ausprogrammieren des Zustandsmusters sollte vorher überlegt werden, ob
Prinzipiell kann jedes zustandsabhängige Verhalten durch dieses Entwurfsmuster abgebildet werden. Einige Beispiele für zustandsbehaftete Problemstellungen sind
using System;
namespace Wikipedia.Patterns
{
class File
{
public File()
{
Console.WriteLine("Creating a closed file.");
myState = ClosedState.Instance;
}
public void Open() { myState.Open(this); }
public void Close() { myState.Close(this); }
public void Delete() { myState.Delete(this); }
internal void ChangeState(State state)
{
myState = state;
}
private State myState;
};
abstract class State
{
internal virtual void Open(File file)
{
Console.WriteLine("State.Open does nothing by default.");
}
internal virtual void Close(File file)
{
Console.WriteLine("State.Close does nothing by default.");
}
internal virtual void Delete(File file)
{
Console.WriteLine("State.Delete does nothing by default.");
}
};
class OpenState : State
{
public static readonly OpenState Instance = new OpenState();
internal override void Close(File file)
{
Console.Write("OpenState.Close will close the file now.");
file.ChangeState(ClosedState.Instance);
Console.WriteLine(" The file is now closed.");
}
};
class ClosedState : State
{
public static readonly ClosedState Instance = new ClosedState();
internal override void Open(File file)
{
Console.Write("ClosedState.Open will open the file now.");
file.ChangeState(OpenState.Instance);
Console.WriteLine(" The file is now open.");
}
internal override void Delete(File file)
{
Console.Write("OpenState.Delete will delete the file now.");
file.ChangeState(DeletedState.Instance);
Console.WriteLine(" The file is now deleted.");
}
};
class DeletedState : State
{
public static readonly DeletedState Instance = new DeletedState();
};
class MainClass
{
public static void Main()
{
File file = new File();
file.Open();
file.Open();
file.Close();
file.Close();
file.Delete();
file.Delete();
Console.ReadLine();
}
};
}
Die Ausgabe dieses Programmes ist:
Creating a closed file. ClosedState.Open will open the file now. The file is now open. State.Open does nothing by default. OpenState.Close will close the file now. The file is now closed. State.Close does nothing by default. OpenState.Delete will delete the file now. The file is now deleted. State.Delete does nothing by default.
Erzeugungsmuster: Fabrikmethode | Abstrakte Fabrik | Erbauer | Prototyp | Einzelstück
Strukturmuster: Adapter | Brücke | Kompositum | Dekorierer | Fassade | Fliegengewicht | Stellvertreter
Verhaltensmuster: Interpreter | Schablonenmethode | Zuständigkeitskette | Kommando | Iterator | Vermittler | Memento | Beobachter | Zustand | Strategie | Besucher | Plugin
(Klassenmuster sind kursiv dargestellt)