У мене є class Car
який має 2 властивості: int price
і boolean inStock
. Він також тримає List
з abstract class State
(порожнього класу). Є два стану, які можна застосувати на автомобілі, і кожне представлене власним класом: class Upgrade extends State
і class Shipping extends State
.
А Car
може містити будь-яку кількість кожного з двох станів. Держави мають такі правила:
Upgrade
: додає1
до ціни за кожний стан, застосований до автомобіля після себе.Shipping
: якщоShipping
в списку є щонайменше 1 стан, тодіinStock
він встановлюється вfalse
.
Так , наприклад, починаючи з price = 1
і 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
Я думав про схему спостерігача, де кожна операція додавання та видалення сповіщає спостерігачів. Я мав на увазі щось подібне, але воно не підкоряється правилам, які я поставив:
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);
}
}
Очевидно, це не працює. Коли a Shipping
видаляється, щось потрібно перевірити, чи є інша установка стану inStock
false, тому видалення Shipping
не може просто inStock = true
. Upgrade
збільшується price
при кожному дзвінку. Потім я додав константи для значень за замовчуванням і спробував перерахунок на основі цих.
Я ні в якому разі не намагаюся нав’язати будь-яку закономірність, я просто намагаюся знайти рішення для вищезазначених вимог. Зауважте, що на практиці Car
міститься багато властивостей і існує багато станів, які можна застосувати таким чином. Я подумав про кілька способів зробити це:
- Оскільки кожен спостерігач отримує
Car
, він може переглядати всіх інших зареєстрованих на даний момент спостерігачів і на основі цього зробити зміни. Я не знаю, чи розумно заплутувати таких спостерігачів. - Коли спостерігач буде доданий або видалений
Car
, відбудеться перерахунок. Однак цей перерахунок доведеться робити всім спостерігачам незалежно від того, що було додано / видалено. - Майте зовнішній клас "менеджер", який буде викликати методи додавання та видалення та робити перерахунок.
Яка хороша модель дизайну для втілення описаної поведінки та як вона буде працювати?