Das Zustandsmuster ist eines der Verhaltensmuster. Das Zustandsmuster wird verwendet, wenn ein Objekt sein Verhalten basierend auf seinem internen Zustand ändert.
Zustandsmuster
Wenn wir das Verhalten eines Objekts basierend auf seinem Zustand ändern müssen, können wir eine Zustandsvariable im Objekt haben. Verwenden Sie dann einen wenn-sonst-Bedingungsblock, um verschiedene Aktionen basierend auf dem Zustand auszuführen. Das Zustandsmuster wird verwendet, um eine systematische und locker gekoppelte Möglichkeit zur Erreichung dieses Ziels durch Implementierungen von
Context
und State
bereitzustellen. Das Zustandsmuster Kontext ist die Klasse, die eine Zustandsreferenz zu einer der konkreten Implementierungen des Zustands hat. Der Kontext leitet die Anfrage zur Verarbeitung an das Zustandsobjekt weiter. Lassen Sie uns dies anhand eines einfachen Beispiels verstehen. Angenommen, wir möchten eine TV-Fernbedienung mit einer einfachen Taste implementieren, um eine Aktion auszuführen. Wenn der Zustand EIN ist, wird der Fernseher eingeschaltet, und wenn der Zustand AUS ist, wird der Fernseher ausgeschaltet. Wir können dies mit einer if-else-Bedingung implementieren, wie unten gezeigt; TVRemoteBasic.java
package com.journaldev.design.state;
public class TVRemoteBasic {
private String state="";
public void setState(String state){
this.state=state;
}
public void doAction(){
if(state.equalsIgnoreCase("ON")){
System.out.println("TV is turned ON");
}else if(state.equalsIgnoreCase("OFF")){
System.out.println("TV is turned OFF");
}
}
public static void main(String args[]){
TVRemoteBasic remote = new TVRemoteBasic();
remote.setState("ON");
remote.doAction();
remote.setState("OFF");
remote.doAction();
}
}
Beachten Sie, dass der Client-Code die spezifischen Werte kennen sollte, um den Zustand des Remote zu setzen. Darüber hinaus wird es bei zunehmender Anzahl von Zuständen sehr schwierig sein, die enge Kopplung zwischen Implementierung und Client-Code zu pflegen und zu erweitern. Jetzt werden wir das Zustandsmuster verwenden, um das oben genannte TV-Fernbedienungsbeispiel zu implementieren.
Zustandsmuster-Schnittstelle
Zunächst erstellen wir eine Zustandschnittstelle, die die Methode definieren wird, die von verschiedenen konkreten Zuständen und der Kontextklasse implementiert werden soll. State.java
package com.journaldev.design.state;
public interface State {
public void doAction();
}
Zustandsmuster Konkrete Zustandsimplementierungen
In unserem Beispiel können wir zwei Zustände haben – einen zum Einschalten des Fernsehers und einen anderen zum Ausschalten. Daher werden wir zwei konkrete Zustandsimplementierungen für diese Verhaltensweisen erstellen. TVStartState.java
package com.journaldev.design.state;
public class TVStartState implements State {
@Override
public void doAction() {
System.out.println("TV is turned ON");
}
}
TVStopState.java
package com.journaldev.design.state;
public class TVStopState implements State {
@Override
public void doAction() {
System.out.println("TV is turned OFF");
}
}
Jetzt sind wir bereit, unser Kontextobjekt zu implementieren, das sein Verhalten basierend auf seinem internen Zustand ändern wird.
Zustandsentwurfsmuster Kontextimplementierung
TVContext.java
package com.journaldev.design.state;
public class TVContext implements State {
private State tvState;
public void setState(State state) {
this.tvState=state;
}
public State getState() {
return this.tvState;
}
@Override
public void doAction() {
this.tvState.doAction();
}
}
Beachten Sie, dass der Kontext auch den Zustand implementiert und eine Referenz seines aktuellen Zustands behält und die Anfrage an die Zustandsimplementierung weiterleitet.
Zustandsentwurfsmuster Testprogramm
Jetzt schreiben wir ein einfaches Programm, um unser Zustandsmuster für die TV-Fernbedienung zu testen. TVRemote.java
package com.journaldev.design.state;
public class TVRemote {
public static void main(String[] args) {
TVContext context = new TVContext();
State tvStartState = new TVStartState();
State tvStopState = new TVStopState();
context.setState(tvStartState);
context.doAction();
context.setState(tvStopState);
context.doAction();
}
}
Die Ausgabe des obigen Programms ist dieselbe wie die grundlegende Implementierung der TV-Fernbedienung ohne Verwendung des Zustandsmusters.
Zustandsentwurfsmuster Vorteile
Die Vorteile der Verwendung des Zustandsmusters zur Implementierung polymorpher Verhaltensweisen sind deutlich sichtbar. Die Wahrscheinlichkeit von Fehlern ist geringer, und es ist sehr einfach, weitere Zustände für zusätzliches Verhalten hinzuzufügen. Dies macht unseren Code robuster, leicht wartbar und flexibler. Das Zustandsmuster hilft auch dabei, bedingte Logik mit if-else oder switch-case in diesem Szenario zu vermeiden. Das Zustandsmuster ähnelt sehr dem Strategiemuster, sieh dir Strategiemuster in Java an. Das ist alles zum Zustandsentwurfsmuster in Java, ich hoffe, es hat dir gefallen.
Source:
https://www.digitalocean.com/community/tutorials/state-design-pattern-java