Eu tenho um class Carque tem 2 propriedades: int pricee boolean inStock. Ele também contém um Listde abstract class State(classe vazia). Existem 2 estados que podem ser aplicados no carro e cada um é representado por sua própria classe: class Upgrade extends Statee class Shipping extends State.
A Carpode conter qualquer número de cada um dos 2 estados. Os estados têm as seguintes regras:
Upgrade: aumenta1o preço de cada estado aplicado ao carro depois dele.Shipping: se houver pelo menos 1Shippingestado na lista,inStockserá definido comofalse.
Por exemplo, começando com price = 1e 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
Eu estava pensando no padrão de observador em que cada operação de adição e remoção notifica os observadores. Eu tinha algo em mente, mas isso não obedece às regras que eu propus:
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);
}
}
Obviamente, isso não funciona. Quando a Shippingé removido, algo deve verificar se há outra configuração de estado inStockcomo false, portanto, a remoção de Shippingnão pode ser apenas inStock = true. Upgradeaumenta pricea cada chamada. Em seguida, adicionei constantes para os valores padrão e tentei um recálculo com base nesses valores.
Não estou tentando impor nenhum padrão, apenas estou tentando encontrar uma solução para os requisitos acima. Observe que, na prática, Carcontém muitas propriedades e há muitos estados que podem ser aplicados dessa maneira. Pensei em algumas maneiras de fazer isso:
- Como cada observador recebe
Car, ele pode observar todos os outros observadores atualmente registrados e fazer uma alteração com base nisso. Não sei se é inteligente envolver os observadores assim. - Quando um observador é adicionado ou removido
Car, haverá um recálculo. No entanto, esse recálculo deverá ser feito em todos os observadores, independentemente do que acabou de ser adicionado / removido. - Tenha uma classe "gerenciadora" externa que chamará os métodos de adição e remoção e fará o recálculo.
Qual é um bom padrão de design para implementar o comportamento descrito e como ele funcionaria?