Ich habe eine, class Car
die 2 Eigenschaften hat: int price
und boolean inStock
. Es enthält auch eine List
von abstract class State
(leere Klasse). Es gibt 2 Zustände, die auf das Auto angewendet werden können und jeder wird durch seine eigene Klasse dargestellt: class Upgrade extends State
und class Shipping extends State
.
A Car
kann eine beliebige Anzahl der beiden Zustände enthalten. Die Staaten haben folgende Regeln:
Upgrade
: erhöht1
den Preis für jeden Zustand, der auf das Auto nach sich selbst angewendet wird.Shipping
: WennShipping
die Liste mindestens 1 Status enthält,inStock
wird auf gesetztfalse
.
Zum Beispiel beginnend mit price = 1
und inStock = true
:
add Shipping s1 --> price: 1, inStock: false
add Upgrade g1 --> price: 1, inStock: false
add Shipping s2 --> price: 2, inStock: false
add Shipping s3 --> price: 3, inStock: false
remove Shipping s2 --> price: 2, inStock: false
remove Upgrade g1 --> price: 1, inStock: false
remove Shipping s1 --> price: 1, inStock: false
remove Shipping s3 --> price: 1, inStock: true
Ich dachte über das Beobachtermuster nach, bei dem jeder Vorgang zum Hinzufügen und Entfernen Beobachter benachrichtigt. Ich hatte so etwas im Sinn, aber es entspricht nicht den Regeln, die ich aufgestellt habe:
abstract class State implements Observer {
public abstract void update();
}
class Car extends Observable {
List<State> states = new ArrayList<>();
int price = 100;
boolean inStock = true;
void addState(State state) {
if (states.add(state)) {
addObserver(state);
setChanged();
notifyObservers();
}
}
void removeState(State state) {
if (states.remove(state)) {
deleteObserver(state);
setChanged();
notifyObservers();
}
}
}
class Upgrade extends State {
@Override
public void update(Observable o, Object arg) {
Car c = (Car) o;
int bonus = c.states.size() - c.states.indexOf(this) - 1;
c.price += bonus;
System.out.println(c.inStock + " " + c.price);
}
}
class Shipping extends State {
@Override
public void update(Observable o, Object arg) {
Car c = (Car) o;
c.inStock = false;
System.out.println(c.inStock + " " + c.price);
}
}
Offensichtlich funktioniert das nicht. Wenn a Shipping
entfernt wird, muss etwas prüfen, ob es eine andere Statuseinstellung inStock
auf false gibt, sodass ein Entfernen von Shipping
nicht einfach ist inStock = true
. Upgrade
erhöht sich price
bei jedem Anruf. Ich habe dann Konstanten für die Standardwerte hinzugefügt und eine Neuberechnung basierend auf diesen versucht.
Ich versuche keineswegs, ein Muster aufzuerlegen, ich versuche nur, eine Lösung für die oben genannten Anforderungen zu finden. Beachten Sie, dass in der Praxis Car
viele Eigenschaften enthalten und es viele Zustände gibt, die auf diese Weise angewendet werden können. Ich dachte über ein paar Möglichkeiten nach:
- Da jeder Beobachter empfängt
Car
, kann er alle anderen derzeit registrierten Beobachter anzeigen und darauf basierend eine Änderung vornehmen. Ich weiß nicht, ob es klug ist, solche Beobachter zu verwickeln. - Wenn ein Beobachter hinzugefügt oder entfernt wird
Car
, erfolgt eine Neuberechnung. Diese Neuberechnung muss jedoch für alle Beobachter durchgeführt werden, unabhängig davon, welcher gerade hinzugefügt / entfernt wurde. - Haben Sie eine externe "Manager" -Klasse, die die Methoden zum Hinzufügen und Entfernen aufruft und die Neuberechnung durchführt.
Was ist ein gutes Entwurfsmuster, um das beschriebene Verhalten zu implementieren, und wie würde es funktionieren?