Ich habe eine Order-Klasse, die eine Reihe von definierten Zuständen durchläuft. Um dies zu unterstützen, habe ich das State-Muster so implementiert, dass das Order-Objekt über ein CurrentState-Member verfügt, das eine IOrderState-Schnittstelle implementiert. Ich habe dann konkrete Implementierungen dieser Schnittstelle wie OrderStateNew, OrderStateDelivered etc usw.Wie sollte ein Objekt, das das Zustandsmuster verwendet, in den nächsten Zustand übergehen?
Meine Frage ist, was ist der richtige Weg, das Order-Objekt zwischen Zuständen zu überführen? Ist es akzeptabel, eine Order.SetState() -Methode zu verwenden, die es einem externen Dienst ermöglicht, den Status festzulegen? Die Kriterien, die die Statusänderungen bestimmen, werden extern auf dem Order-Objekt gespeichert, so dass dies die offensichtliche Antwort scheint, aber ich bin etwas unruhig darüber, eine öffentliche Methode auf meinem Objekt zu haben, um etwas so grundlegendes zu ändern.
Zusätzliche Klärung Ich dachte, es nützlich sein könnte, etwas ausführlicher über meine Implementierung hinzufügen, weil ich frage mich, ob ich wirklich bin das Muster richtig in erster Linie verwendet wird. Hier ist die pulbic API für die Erstellung und Genehmigung von einer Bestellung
Dim orderFacade As New OrderFacade
Dim order = orderFacade.createFrom(customer)
' Add lines etc
' This will validate the order and transition it to status 'Authorised'
Dim valid = orderFacade.Authorise(order)
' This will commit the order, but only if it is at status 'Authorised'
Dim result = orderFacade.Commit()
Die OrderFacade.Authorise() Funktion so etwas wie dieses
Public Function Authorise(ByRef originalOrder As Order) As ValidationSummary
If originalOrder.CurrentState.CanAuthorise() Then
Dim validator = OrderValidatorFactory.createFrom(originalOrder)
Dim valid = validator.ValidateOrder(originalOrder)
If valid.IsValid Then
originalOrder.SetOrderStatus(OrderStatus.Authorised)
End If
Return valid
End If
End Function
sieht Wie Sie sehen können, ist das Aktuellerstatus Mitglied der aktuelle IOrderState Implementierung, die bestimmt, Welche Aktivitäten sind für das Objekt gültig? Ich frage mich, ob dies für den Übergang und nicht für die OrderFacade verantwortlich sein sollte?
bezogen: http://stackoverflow.com/questions/1647631/c-state-machine-design – jldupont