www.wikidata.de-de.nina.az
Der Zustand englisch state ist ein Entwurfsmuster aus dem Bereich der Softwareentwicklung das zur Kategorie der Verhaltensmuster englisch behavioral design patterns gehort Das Zustandsmuster wird zur Kapselung unterschiedlicher zustandsabhangiger Verhaltensweisen eines Objektes eingesetzt 1 Das Zustandsmuster ist eines der sogenannten GoF Muster d h es ist eines der im Buch Entwurfsmuster Elemente wiederverwendbarer objektorientierter Software aufgefuhrten Entwurfsmuster GoF steht fur Gang of Four oder Viererbande nach den vier Autoren dieses 1994 veroffentlichten Buches Das Zustandsmuster ist auch bekannt als Objekte fur Zustande objects for states Inhaltsverzeichnis 1 Verwendung 1 1 Problem 1 1 1 Zustandsautomat 1 1 2 Hierarchischer Zustandsautomat 1 2 Losung 1 2 1 Einfache Zustande 2 Akteure 3 Varianten 4 Vor und Nachteile 5 Beispiele 5 1 C 5 2 Java 6 Weblinks 7 EinzelnachweiseVerwendung BearbeitenGrundsatzlich gilt dass das Verhalten eines Objekts abhangig von seinem Zustand ist Durch die ubliche Implementierung soll vermieden werden die Zustande eines Objekts und das davon abhangige Verhalten in einer grossen switch Anweisung basierend auf enumerierten Konstanten zu kodieren Jeder Fall der switch Anweisung soll in einer eigenen Klasse implementiert werden so dass der Zustand des Objektes selbst wieder ein Objekt ist das unabhangig von anderen Objekten ist Problem Bearbeiten Zustandsautomat Bearbeiten Fur ein Objekt sind verschiedene Zustande die moglichen Ubergange zwischen diesen Zustanden und das davon abhangige 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 weissen Umrandung auf den Endzustand Die gerichteten Kanten Pfeile zwischen den Zustanden Closed Open und Deleted definieren den Zustandswechsel nbsp ZustandsdiagrammHierarchischer Zustandsautomat Bearbeiten Ein einzelner Zustand eines Objektes kann wiederum in eine Anzahl verschiedener Zustande aufgeteilt werden Den Zustand Open kann man beispielsweise unterteilen in Read und Write Sie bilden einen zusammengesetzten Zustand Open Closed sowie Deleted betrachtet man unabhangig vom zusammengesetzten Zustand Open Diese Zustande kann man in einer Hierarchie anordnen Open Closed und Deleted sind in der ersten Ebene In der zweiten Ebene befinden sich Read und Write die dem Zustand Open zugeordnet sind Losung Bearbeiten Einfache Zustande Bearbeiten Das zustandsabhangige Verhalten des Objekts wird in separate Klassen ausgelagert wobei fur jeden moglichen Zustand eine eigene Klasse eingefuhrt wird die das Verhalten des Objekts in diesem Zustand definiert Damit der Kontext die separaten Zustandsklassen einheitlich behandeln kann wird eine gemeinsame Abstrahierung dieser Klassen definiert Bei einem Zustandsubergang tauscht der Kontext das von ihm verwendete Zustandsobjekt aus nbsp KlassendiagrammAkteure BearbeitenIm Entwurfsmuster des Zustandes spielen drei Akteure eine Rolle Der Kontext definiert die clientseitige Schnittstelle und verwaltet die separaten Zustandsklassen Ausserdem tauscht er diese bei einem Zustandsubergang aus Der Zustand definiert eine einheitliche Schnittstelle aller Zustandsobjekte und implementiert gegebenenfalls ein Standardverhalten Beispielsweise kann im abstrakten Zustand die Ausfuhrung jeglichen Verhaltens gesperrt werden Das Verhalten kann in diesem Falle nur dann ausgefuhrt werden wenn es vom konkreten Zustand durch Uberschreiben der entsprechenden Methode freigeschaltet wurde Der konkrete Zustand wiederum implementiert das Verhalten das mit dem Zustand des Kontextobjektes verbunden ist Varianten BearbeitenFur den Akteur Zustand kann eine Schnittstelle anstatt einer abstrakten Klasse definiert werden Konnen mehrere Kontexte die gleichen Statusobjekte verwenden sofern die Status durch ihre jeweiligen Klassen und nicht durch Instanzen definierbar sind bzw Eigenschaftswerte in den Kontext ausgelagert werden konnen z B der Dateiname kann Speicherplatz eingespart werden Vor und Nachteile BearbeitenEin Vorteil des Systems ist dass komplexe und schwer zu lesende Bedingungsanweisungen vermieden werden konnen Ausserdem konnen neue Zustande und neues Verhalten auf einfache Weise hinzugefugt werden Die Wartbarkeit wird erhoht und Zustandsobjekte konnen wiederverwendet werden Auf der anderen Seite rechtfertigt der Nutzen bei sehr einfachem zustandsbehaftetem Verhalten unter Umstanden nicht den teils betrachtlichen Implementierungsaufwand Kann das Objekt sehr viele Zustande annehmen in denen jeweils nur sehr wenige Aktionen erlaubt sind muss dennoch jeder Zustand fur jede Aktion der anderen Zustande Code enthalten um die Schnittstelle korrekt zu implementieren auch wenn in diesen jeweils nur eine Ausnahmebehandlung stattfindet In einer grossen Bedingungsanweisung liesse sich die Ausnahmebehandlung hingegen in einem gemeinsamen sonst Zweig vereinen Beispiele BearbeitenPrinzipiell kann jedes zustandsabhangige Verhalten durch dieses Entwurfsmuster abgebildet werden Beispielsweise wird es fur die Verwaltung von Sessions oder von Ein und Ausgabestromen bei zustandbehafteten Bedienelementen einer grafischen Benutzeroberflache oder bei Parkautomaten verwendet C Bearbeiten Diese C 14 Implementierung basiert auf dem vor C 98 Beispielcode im Buch Entwurfsmuster include lt iostream gt include lt stdexcept gt include lt memory gt typedef const char TCPOktettStream class TCPZustand definiert die Klienten interessierende Schnittstelle class TCPVerbindung Kontext public TCPVerbindung void oeffneAktiv void oeffnePassiv void synchronisiere void sende TCPOktettStream void schliesse void bearbeiteOktett TCPOktettStream o std cout lt lt lt lt this lt lt TCPVerbindung bearbeiteOktett lt lt o lt lt n private friend class TCPZustand void aendereZustand TCPZustand s zustand s braucht TCPZustand Deklaration private verwaltet eine Instanz Exemplar einer KonkreterZustand Unterklasse welche den aktuellen Zustand definiert TCPZustand zustand definiert eine Schnittstelle zur Kapselung des mit einem bestimmten Zustand des Kontextobjekts verbundenen Verhaltens class TCPZustand Zustand public virtual void uebertrage TCPVerbindung TCPOktettStream 0 virtual void oeffneAktiv TCPVerbindung 0 virtual void oeffnePassiv TCPVerbindung 0 virtual void schliesse TCPVerbindung 0 virtual void synchronisiere TCPVerbindung 0 virtual TCPZustand default protected void aendereZustand TCPVerbindung t TCPZustand s std cout lt lt TCPZustand aendereZustand zu lt lt s lt lt n t gt aendereZustand s void TCPVerbindung oeffneAktiv std cout lt lt this lt lt TCPVerbindung oeffneAktiv n zustand gt oeffneAktiv this braucht TCPZustand Definition void TCPVerbindung oeffnePassiv std cout lt lt this lt lt TCPVerbindung oeffnePassiv n zustand gt oeffnePassiv this void TCPVerbindung sende TCPOktettStream s std cout lt lt this lt lt TCPVerbindung sende lt lt s lt lt n zustand gt uebertrage this s void TCPVerbindung synchronisiere std cout lt lt this lt lt TCPVerbindung synchronisiere n zustand gt synchronisiere this void TCPVerbindung schliesse std cout lt lt this lt lt TCPVerbindung schliesse n zustand gt schliesse this jede Unterklasse implementiert ein Verhalten das mit einem Zustand des Kontextobjekts verbunden ist class TCPEtabliert public TCPZustand KonkreterZustand public static TCPZustand instance virtual void oeffneAktiv TCPVerbindung override throw std runtime error TCPEtabliert oeffneAktiv virtual void oeffnePassiv TCPVerbindung override throw std runtime error TCPEtabliert oeffnePassiv virtual void synchronisiere TCPVerbindung override throw std runtime error TCPEtabliert synchronisiere virtual void uebertrage TCPVerbindung TCPOktettStream override virtual void schliesse TCPVerbindung override class TCPBereit public TCPZustand KonkreterZustand public static TCPZustand instance virtual void oeffneAktiv TCPVerbindung override throw std runtime error TCPBereit oeffneAktiv virtual void oeffnePassiv TCPVerbindung override throw std runtime error TCPBereit oeffnePassiv virtual void synchronisiere TCPVerbindung override virtual void uebertrage TCPVerbindung TCPOktettStream override throw std runtime error TCPBereit uebertrage virtual void schliesse TCPVerbindung override throw std runtime error TCPBereit schliesse class TCPBeendet public TCPZustand KonkreterZustand public static TCPZustand instance virtual void oeffneAktiv TCPVerbindung override virtual void oeffnePassiv TCPVerbindung override virtual void synchronisiere TCPVerbindung override throw std runtime error TCPBeendet synchronisiere virtual void uebertrage TCPVerbindung TCPOktettStream override throw std runtime error TCPBeendet uebertrage virtual void schliesse TCPVerbindung override throw std runtime error TCPBeendet schliesse braucht TCPBeendet definition TCPVerbindung TCPVerbindung zustand TCPBeendet instance Unterklassen von TCPZustand besitzen keinen lokalen Zustand so dass sie gemeinsam genutzt werden konnen und nur eine Instanz Exemplar benotigt wird static TCPEtabliert tcpEtabliert static TCPBereit tcpBereit static TCPBeendet tcpBeendet TCPZustand TCPEtabliert instance return amp tcpEtabliert TCPZustand TCPBereit instance return amp tcpBereit TCPZustand TCPBeendet instance return amp tcpBeendet gultige Methoden der TCPZustand Kindklassen void TCPEtabliert uebertrage TCPVerbindung t TCPOktettStream o std cout lt lt TCPEtabliert uebertrage lt lt o lt lt n t gt bearbeiteOktett o void TCPEtabliert schliesse TCPVerbindung t std cout lt lt TCPEtabliert schliesse n aendereZustand t TCPBeendet instance void TCPBereit synchronisiere TCPVerbindung t std cout lt lt TCPBereit synchronisiere n aendereZustand t TCPEtabliert instance void TCPBeendet oeffneAktiv TCPVerbindung t std cout lt lt TCPBeendet oeffneAktiv n aendereZustand t TCPEtabliert instance void TCPBeendet oeffnePassiv TCPVerbindung t std cout lt lt TCPBeendet oeffnePassiv n aendereZustand t TCPBereit instance int main Die Smart Pointers verhindern Memory Leaks std unique ptr lt TCPVerbindung gt tc1 std make unique lt TCPVerbindung gt std unique ptr lt TCPVerbindung gt tc2 std make unique lt TCPVerbindung gt tc1 gt oeffneAktiv tc2 gt oeffnePassiv tc1 gt sende Hello tc2 gt synchronisiere tc2 gt sende world tc1 gt schliesse tc2 gt schliesse tc2 gt sende again Die Programmausgabe ist ahnlich zu 0x19d9e70 TCPVerbindung oeffneAktiv TCPBeendet oeffneAktiv TCPZustand aendereZustand zu 0x6030a8 0x19d9e90 TCPVerbindung oeffnePassiv TCPBeendet oeffnePassiv TCPZustand aendereZustand zu 0x6030b0 0x19d9e70 TCPVerbindung sende Hello TCPEtabliert uebertrage Hello 0 x19d9e70 TCPVerbindung bearbeiteOktett Hello 0x19d9e90 TCPVerbindung synchronisiere TCPBereit synchronisiere TCPZustand aendereZustand zu 0x6030a8 0x19d9e90 TCPVerbindung sende world TCPEtabliert uebertrage world 0 x19d9e90 TCPVerbindung bearbeiteOktett world 0x19d9e70 TCPVerbindung schliesse TCPEtabliert schliesse TCPZustand aendereZustand zu 0x6030b8 0x19d9e90 TCPVerbindung schliesse TCPEtabliert schliesse TCPZustand aendereZustand zu 0x6030b8 0x19d9e90 TCPVerbindung sende again terminate called after throwing an instance of std runtime error what TCPBeendet uebertrage Java Bearbeiten Hier ist ein Beispiel fur das Verhaltensmuster Zustand interface Statelike void writeName final StateContext STATE CONTEXT final String NAME class StateA implements Statelike Override public void writeName final StateContext STATE CONTEXT final String NAME System out println NAME toLowerCase STATE CONTEXT setState new StateB class StateB implements Statelike State counter private int count 0 Override public void writeName final StateContext STATE CONTEXT final String NAME System out println NAME toUpperCase Change state after StateB s writeName gets invoked twice if count gt 1 STATE CONTEXT setState new StateA Die Kontextklasse hat eine Zustandsvariable die sie hier als StateA in einem Anfangszustand instanziiert In seinen Methoden verwendet sie die entsprechenden Methoden des Zustandsobjekts public class StateContext private Statelike myState public StateContext setState new StateA public void setState final Statelike NEW STATE myState NEW STATE public void writeName final String NAME myState writeName this NAME Der Test unten soll auch die Verwendung veranschaulichen public class TestClientState public static void main String args final StateContext SC new StateContext SC writeName Montag SC writeName Dienstag SC writeName Mittwoch SC writeName Donnerstag SC writeName Freitag SC writeName Samstag SC writeName Sonntag Gemass obigem Code ist die Ausgabe der main Methode von TestClientState montag DIENSTAG MITTWOCH donnerstag FREITAG SAMSTAG sonntagWeblinks Bearbeiten nbsp Wikibooks Zustand Implementierung des Zustands in unterschiedlichen Sprachen State Design Pattern Einsteigerfreundliche Einfuhrung Zustandsautomat in Java mithilfe des State Patterns Beispielimplementierung des Zustandsmusters in JavaEinzelnachweise Bearbeiten Erich Gamma Richard Helm Ralph Johnson John Vlissides Entwurfsmuster Elemente wiederverwendbarer objektorientierter Software 5 Auflage Addison Wesley 1996 ISBN 3 8273 1862 9 S 398 englisch Design Patterns Elements of Reusable Object Oriented Software V DEntwurfsmusterErzeugungsmuster Abstrakte Fabrik Erbauer Fabrikmethode Prototyp Singleton Multiton ObjektpoolStrukturmuster Adapter Brucke Decorator Fassade Fliegengewicht Kompositum StellvertreterVerhaltensmuster Beobachter Besucher Interpreter Iterator Kommando Memento Schablonenmethode Strategie Vermittler Zustand Zustandigkeitskette Interceptor Nullobjekt ProtokollstapelMuster fur objektrelationale Abbildung Datentransferobjekt Table Data Gateway Row Data Gateway Active Record Unit of Work Identity Map Lazy Loading Identity Field Dependent Mapping Embedded Value Serialized LOB Inheritance Mapper Metadata Mapping Query Object Command Query Responsibility SegregationNachrichtenubermittlungsmuster Message Command Message Document Message Event Message Request Reply Return Address Correlation Identifier Message Sequence Message Expiration Format Indicator Message Channel Point to Point Channel Publisher Subscriber Channel Datatype Channel Invalid Message Channel Dead Letter Channel Guaranteed Delivery Channel Adapter Messaging Bridge Message Bus Pipes and Filters Message Router Content based Router Message Filter Dynamic Router Recipient List Splitter Aggregator Resequencer Composed Message Processor Scatter Gather Routing Slip Process Manager Message Broker Message Translator Envelope Wrapper Content Enricher Content Filter Claim Check Normalizer Canonical Data Model Message Endpoint Messaging Gateway Messaging Mapper Transactional Client Polling Consumer Event driven Consumer Competing Consumers Message Dispatcher Selective Consumer Durable Subscriber Idempotent Receiver Service Activator Control Bus Detour Wire Tap Message History Message Store Smart Proxy Test Message Channel PurgerAndere Application Controller Business Delegate Data Access Object Dependency Injection Extension Interface Fluent Interface Inversion of Control IoC Lock Model View Controller MVC Model View Presenter MVP Model View Update MVU Model View ViewModel MVVM Page Controller Registry Remote Facade Repository Service Locator Session State Table Module Template View Threadpool Transaction Script Transform View Two Step View Value ObjectSiehe auch Analysemuster Architekturmuster Abgerufen von https de wikipedia org w index php title Zustand Entwurfsmuster amp oldid 233540556