State Design Pattern
Das State Design Pattern ist eines der verhaltensbasierten Entwurfsmuster. Es wird verwendet, wenn ein Objekt sein Verhalten basierend auf seinem internen Zustand ändert.
Überblick über das State Design Pattern
Das State Design Pattern, angewendet in Java, ermöglicht es, das Verhalten eines Objekts basierend auf seinem Zustand zu ändern. Wir können eine Zustandsvariable im Objekt haben. Dann verwenden wir if-else-Bedingungsblöcke, um unterschiedliche Aktionen basierend auf dem Zustand durchzuführen. Das State Design Pattern wird verwendet, um dies auf eine systematische und lose gekoppelte Weise durch Context- und State-Implementierungen zu erreichen. Der State Pattern Context ist die Klasse, die einen State-Verweis auf eine der konkreten Implementierungen des State hat. Der Context leitet die Anfrage zur Verarbeitung an das State-Objekt weiter.
Beispiel für das State Design Pattern
Lassen Sie uns dies anhand eines einfachen Beispiels verstehen. Nehmen wir an, wir möchten eine TV-Fernbedienung mit einem einfachen Knopf zur Aktionsausführung implementieren. Wenn der Zustand ON ist, wird der Fernseher eingeschaltet und wenn der Zustand OFF ist, wird der Fernseher ausgeschaltet. Wir können dies mit einer if-else-Bedingung wie unten implementieren; 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 ist eingeschaltet");
}else if(state.equalsIgnoreCase("OFF")){
System.out.println("TV ist ausgeschaltet");
}
}
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 muss, um den Zustand der Fernbedienung einzustellen. Wenn die Anzahl der Zustände zunimmt, wird die enge Kopplung zwischen Implementierung und Client-Code sehr schwer zu pflegen und zu erweitern sein. Jetzt werden wir das State Pattern verwenden, um das obige Beispiel der TV-Fernbedienung zu implementieren.
State Design Pattern Interface
Zuerst erstellen wir ein State-Interface, das die Methode definieren wird, die von verschiedenen konkreten Zuständen und der Context-Klasse implementiert werden sollte. State.java
package com.journaldev.design.state;
public interface State {
public void doAction();
}
Konkrete State Design Pattern Zustandsimplementierungen
In unserem Beispiel können wir zwei Zustände haben – einen, um den Fernseher einzuschalten, und einen anderen, um ihn auszuschalten. Daher erstellen wir zwei konkrete Zustandsimplementierungen für diese Verhaltensweisen. TVStartState.java und TVStopState.java
package com.journaldev.design.state;
public class TVStartState implements State {
@Override
public void doAction() {
System.out.println("TV ist eingeschaltet");
}
}
package com.journaldev.design.state;
public class TVStopState implements State {
@Override
public void doAction() {
System.out.println("TV ist ausgeschaltet");
}
}
State Design Pattern Context Implementierung
Jetzt sind wir bereit, unser Context-Objekt zu implementieren, das sein Verhalten basierend auf seinem internen Zustand ändern wird. 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 Context ebenfalls State implementiert und eine Referenz seines aktuellen Zustands behält und die Anfrage an die State-Implementierung weiterleitet.
Testprogramm für das State Design Pattern
Lassen Sie uns nun ein einfaches Programm schreiben, um unsere State-Pattern-Implementierung der 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();
}
}
Das Ergebnis des oben genannten Programms ist dasselbe wie die grundlegende Implementierung der TV-Fernbedienung ohne Verwendung des State-Patterns.
Vorteile des State Design Patterns
Die Vorteile der Verwendung des State-Patterns zur Implementierung polymorphen Verhaltens sind in dieser Anleitung deutlich sichtbar. Die Fehlerwahrscheinlichkeit ist geringer und es ist sehr einfach, weitere Zustände für zusätzliches Verhalten hinzuzufügen. Dadurch wird unser Code robuster, leichter wartbar und flexibler. Außerdem hat das State-Pattern geholfen, if-else- oder switch-case-Bedingungslogik in diesem Szenario und dieser Anleitung zu vermeiden.