我有一个class Car
具有2个属性的属性:int price
和boolean inStock
。它还持有List
的abstract class State
(空类)。可以在汽车上应用两种状态,每种状态由其自己的类表示:class Upgrade extends State
和class Shipping extends State
。
A Car
可以容纳2个状态中的任何一个。各州有以下规则:
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);
}
}
显然,这是行不通的。当一个Shipping
被删除,一些必须检查是否有另一种状态设置inStock
为false,所以去除Shipping
不能随便inStock = true
。每次通话Upgrade
增加price
。然后,我为默认值添加了常量,并尝试基于这些常量进行重新计算。
我绝不是要强加任何模式,我只是想为上述要求找到解决方案。请注意,实际上Car
包含许多属性,并且可以通过这种方式应用许多状态。我考虑了几种方法:
- 由于每个观察者都会收到
Car
,因此它可以查看当前注册的所有其他观察者,并根据此进行更改。我不知道像这样纠缠观察者是否明智。 - 在中添加或删除观察者时
Car
,将进行重新计算。但是,无论是否添加或删除了一个观察者,都必须对所有观察者进行重新计算。 - 有一个外部“ manager”类,它将调用add和remove方法并进行重新计算。
什么是实施所描述行为的良好设计模式,它将如何工作?