Ich habe eine, class Cardie 2 Eigenschaften hat: int priceund boolean inStock. Es enthält auch eine Listvon 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 Stateund class Shipping extends State.
A Carkann eine beliebige Anzahl der beiden Zustände enthalten. Die Staaten haben folgende Regeln:
Upgrade: erhöht1den Preis für jeden Zustand, der auf das Auto nach sich selbst angewendet wird.Shipping: WennShippingdie Liste mindestens 1 Status enthält,inStockwird auf gesetztfalse.
Zum Beispiel beginnend mit price = 1und 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 Shippingentfernt wird, muss etwas prüfen, ob es eine andere Statuseinstellung inStockauf false gibt, sodass ein Entfernen von Shippingnicht einfach ist inStock = true. Upgradeerhöht sich pricebei 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 Carviele 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?