De staat ontwerppatroon is een van de gedragsontwerppatronen. Het staat ontwerppatroon wordt gebruikt wanneer een object zijn gedrag verandert op basis van zijn interne toestand.
Staat Ontwerppatroon
Als we het gedrag van een object moeten veranderen op basis van zijn toestand, kunnen we een toestandsvariabele in het object hebben. Gebruik vervolgens de if-else-voorwaardenblok om verschillende acties uit te voeren op basis van de toestand. Het staat ontwerppatroon wordt gebruikt om op een systematische en losgekoppelde manier dit te bereiken via de implementaties van
Context
en State
. Staat Patroon Context is de klasse die een toestandsreferentie heeft naar een van de concrete implementaties van de toestand. De Context stuurt het verzoek door naar het toestandsobject voor verwerking. Laten we dit begrijpen aan de hand van een eenvoudig voorbeeld. Stel dat we een tv-afstandsbediening willen implementeren met een eenvoudige knop om een actie uit te voeren. Als de toestand AAN is, schakelt het de tv in en als de toestand UIT is, schakelt het de tv uit. We kunnen het implementeren met een if-else-voorwaarde zoals hieronder; 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();
}
}
Noticeer dat de clientcode de specifieke waarden moet kennen om de status van de afstandsbediening in te stellen. Bovendien, als het aantal staten toeneemt, zal de strakke koppeling tussen de implementatie en de clientcode moeilijk te onderhouden en uit te breiden zijn. Nu zullen we het State-patroon gebruiken om het bovenstaande voorbeeld van de tv-afstandsbediening te implementeren.
Interface voor het State-ontwerppatroon
Allereerst zullen we een State-interface maken die de methode definieert die moet worden geïmplementeerd door verschillende concrete staten en de contextklasse. State.java
package com.journaldev.design.state;
public interface State {
public void doAction();
}
Concrete implementaties van het State-ontwerppatroon
In ons voorbeeld kunnen we twee staten hebben – één om de tv aan te zetten en een andere om deze uit te zetten. Dus we zullen twee concrete implementaties van de staat maken voor deze gedragingen. 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");
}
}
Nu zijn we klaar om ons Context-object te implementeren dat zijn gedrag zal wijzigen op basis van zijn interne staat.
Context Implementatie van het State Ontwerppatroon
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();
}
}
Let op dat Context ook State implementeert en een referentie naar zijn huidige toestand behoudt en het verzoek doorstuurt naar de toestandsimplementatie.
Testprogramma voor het State Ontwerppatroon
Laten we nu een eenvoudig programma schrijven om onze implementatie van het state-patroon voor de TV-afstandsbediening te 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();
}
}
Het uitvoer van bovenstaand programma is hetzelfde als de basisimplementatie van de TV-afstandsbediening zonder het gebruik van het state-patroon.
Voordelen van het State Ontwerppatroon
De voordelen van het gebruik van het State-patroon om polymorf gedrag te implementeren zijn duidelijk zichtbaar. De kans op fouten is kleiner en het is zeer eenvoudig om meer toestanden toe te voegen voor aanvullend gedrag. Dit maakt onze code dus robuuster, gemakkelijker te onderhouden en flexibeler. Ook heeft het State-patroon geholpen om if-else of switch-case conditionele logica in dit scenario te vermijden. Het State-patroon lijkt erg op het Strategiepatroon, bekijk Strategiepatroon in Java. Dat is alles over het State-ontwerppatroon in Java, ik hoop dat je het leuk vond.
Source:
https://www.digitalocean.com/community/tutorials/state-design-pattern-java