J'ai un class Car
qui a 2 propriétés: int price
et boolean inStock
. Il contient également un List
of 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 State
et class Shipping extends State
.
A Car
peut contenir n'importe quel nombre de chacun des 2 états. Les États ont les règles suivantes:
Upgrade
: ajoute1
au prix de chaque état appliqué à la voiture après elle-même.Shipping
: s'il y a au moins 1Shipping
état dans la liste, alorsinStock
est réglé surfalse
.
Par exemple, en commençant par price = 1
et 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 Shipping
est supprimé, quelque chose doit vérifier s'il y a un autre paramètre d'état inStock
sur false, donc une suppression de Shipping
ne peut pas simplement inStock = true
. Upgrade
augmente 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 Car
contient 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?