J'ai un class Carqui a 2 propriétés: int priceet boolean inStock. Il contient également un Listof abstract class State(classe vide). Il y a 2 états qui peuvent être appliqués sur la voiture et chacun est représenté par sa propre classe: class Upgrade extends Stateet class Shipping extends State.
A Carpeut contenir n'importe quel nombre de chacun des 2 états. Les États ont les règles suivantes:
Upgrade: ajoute1au prix de chaque état appliqué à la voiture après elle-même.Shipping: s'il y a au moins 1Shippingétat dans la liste, alorsinStockest réglé surfalse.
Par exemple, en commençant par price = 1et 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
Je pensais au modèle d'observateur où chaque opération d'ajout et de suppression avertit les observateurs. J'avais quelque chose comme ça en tête, mais ça n'obéit pas aux règles que j'ai posées:
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);
}
}
De toute évidence, cela ne fonctionne pas. Quand a Shippingest supprimé, quelque chose doit vérifier s'il y a un autre paramètre d'état inStocksur false, donc une suppression de Shippingne peut pas simplement inStock = true. Upgradeaugmente priceà chaque appel. J'ai ensuite ajouté des constantes pour les valeurs par défaut et tenté un recalcul basé sur celles-ci.
Je n'essaie en aucun cas d'imposer un modèle, j'essaie simplement de trouver une solution pour les exigences ci-dessus. Notez qu'en pratique, il Carcontient de nombreuses propriétés et que de nombreux états peuvent être appliqués de cette manière. J'ai réfléchi à quelques façons de procéder:
- Étant donné que chaque observateur reçoit
Car, il peut regarder tous les autres observateurs actuellement enregistrés et effectuer un changement en fonction de cela. Je ne sais pas s'il est intelligent d'enchevêtrer des observateurs comme celui-ci. - Lorsqu'un observateur est ajouté ou supprimé
Car, il y aura un nouveau calcul. Cependant, ce recalcul devra être effectué sur tous les observateurs indépendamment de celui qui vient d'être ajouté / supprimé. - Avoir une classe "manager" externe qui appellera les méthodes add et remove et fera le recalcul.
Qu'est-ce qu'un bon modèle de conception pour implémenter le comportement décrit et comment cela fonctionnerait-il?