Bevor ich Ihre Frage anspreche, ziehe ich es vor, die Idee des Musters zu überprüfen und Ihnen einige kleine Änderungen in Ihrem Code vorzuschlagen.
Mit dem Statusmuster kann ein Objekt sein Verhalten ändern, wenn sich der interne Status ändert.
In Ihrem Fall sind Leerlauf und Waschen gute Kandidaten, da Zustände und WashingMachine ein guter Kandidat sind, um das Zustandsobjekt zu tragen.
jedoch drei Bemerkungen:
1) durch die Zustände bereitgestellten Verfahren sollten einige Maßnahmen sein, die Umsetzungen nach unterscheiden, unter denen das Objekt angeben.
In Ihrer Erklärung:
public interface WashingMachineState {
public void openLid();
public void closeLid();
public void start();
public void stop();
public void washing();
}
washing()
ist keine Aktion, sondern ein Zustand.
Es ist die start()
Aktion, die den Status von Leerlauf zu Waschen ändert.
In dem Zustand, Muster, das Objekt mit einem Zustand wird den Kontext genannt. In Ihrem Fall ist der Kontext WashingMachine
.
2) In dem Zustandsmuster ist die Idee, dass der Kontext einige Aktionen ausführen möchte, deren Verhalten sich entsprechend dem aktuellen Status ändert.
Um dies zu erreichen, delegiert der Kontext seine Verarbeitungen an seine aktuelle Statusinstanz.
Es vermeidet viele wenn mit - sonst wenn im Rahmen (für jede Verarbeitung), und es erlaubt auch die Komplexität des Kontextes zu reduzieren, denn wenn man den Zustand Muster verwenden zu können, Familien von Verhaltensweisen erhalten:
Verhalten, wenn wir im Ruhezustand sind in der IdleState
Klasse befinden.
Verhalten, wenn wir im Waschzustand sind in WashingState
Klasse.
und so für ...
die Aktionen ausführen zu können, müssen Staat Instanzen den Kontext (WashingMachine
).
Um diese Frage zu adressieren, haben Sie zwei Möglichkeiten tun:
Entweder das WashingMachine
Objekt als ein Feld in der Zustand Instanz oder Weitergabe dieses als Argument, wenn der Kontext WashingMachine
Objekt delegiert die Verarbeitung in den Zustand zu speichern.
Ich schlage vor, Sie den zustandslosen Weg zu verwenden.
So, wenn die startWashing()
-Operation auf eine WashingMachine
Instanz aufgerufen wird, sollte die WashingMachine
Instanz die Verarbeitung an state.startWashing()
delegieren, indem sie sich wie state.startWashing(this)
übergeben.
Der Staat sollte ein WashingMachine
als Parameter angeben:
public interface WashingMachineState {
void openLid(WashingMachine machine);
void closeLid(WashingMachine machine);
void pushStartBtn(WashingMachine machine);
void pushStopBtn(WashingMachine machine);
}
3) Eigentlich definiert man zwei Zustände: Leerlauf und Waschen.
Diese sollten mit einem stopping
Status abgeschlossen werden, da einige Operationen an der Maschine (Öffnen der Tür, Drücken der Start-Btn zum Beispiel ...) ein bestimmtes Verhalten haben, wenn die Maschine im Zustand "ist gestoppt" ist.
Beachten Sie, dass Sie sich mit nur zwei Zuständen fragen können, ob das Muster relevant ist.
Jetzt kann ich auf Ihre Frage beantworten.
Ich möchte wissen, wenn zwischen Zustand zwischen Leerlauf Waschschalt der Umsetzung kann es zwei Möglichkeiten, die Säge über Netz ist
1. WashingMachine
Klasse implementiert Staat Schnittstelle und Schaltzustand von Idle Wasch- oder Umgekehrt basierend auf einer Bedingung
2.Idle und Washing-Klasse hat WashingMachine
als Elementvariable.
WashingMachine
und WashingMachineState
s zusammenarbeiten, aber verschiedene Dinge.
Also müssen sie sich nicht auf die gleiche Schnittstelle verlassen.
Hinzufügen von WashingMachine
Objekt als Felder von Zustand Unterklassen ist eine Möglichkeit.
Wie erläutert, können Sie auch den WashingMachine
als Parameter der State-Methoden übergeben.
Beachten Sie, dass es nicht direkt die WashingMachine
, die den Wechsel von einem Zustand zu einem anderen durchführt.
Dies wird vom Staat durchgeführt.
Und Staaten sollten WashingMachine.changeState()
aufrufen, um es durchzuführen.
Die WashingMachine
könnte sein:
public class WashingMachine {
private WashingMachineState state;
public WashingMachine() {
this.state = new Idle();
}
protected void changeState(WashingMachineState state) {
this.state = state;
}
public void openLid(){
state.openLid(this);
}
public void closeLid(){
state.closeLid(this);
}
public void pushStartBtn(){
state.pushStartBtn(this);
}
public void pushStopBtn(){
state.pushStopBtn(this);
}
public State getState() {
return state;
}
}
Erläuterungen zu Veränderungen an WashingMachine
:
changeState
setState
als aussagekräftiger ist, als Zustandsmuster verwendet wird.
changeState(State)
könnte den protected
Modifikator verwenden, um die Sichtbarkeit dieser Methode zu verringern und natürlich Zustand Subklassen sollte als WashingMachine
im gleichen Paket sein. Es ist ein Implementierungsdetail, das in Java aktiviert ist. Bei anderen OOP-Sprachen haben Sie natürlich andere Alternativen.
über vom Leerlauf zu waschen Schalt, glaube ich, dass es im IdleState
Zustand nur möglich sein soll, als pushStartBtn()
aufgerufen wird. Hier
ist ein Beispiel:
public class IdleState implements State {
public void openLid(WashingMachine machine){
...
}
public void closeLid(WashingMachine machine){
...
}
public void pushStartBtn(WashingMachine machine){
//do processing with machine to begin effectively the washing
...
machine.changeState(new WashingState());
}
public void pushStopBtn(WashingMachine machine){
...
}
}
Weder Ihre Ideen wären eigentlich in Ordnung sein –