私class Car
は2つのプロパティを持つを持っています:int price
とboolean inStock
。またList
、abstract class State
(空のクラス)も保持します。車に適用できる2つの状態があり、それぞれが独自のクラスで表されます: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
されると、再計算されます。ただし、この再計算は、追加または削除されたオブザーバーに関係なく、すべてのオブザーバーで実行する必要があります。 - addメソッドとremoveメソッドを呼び出して再計算を行う外部「マネージャー」クラスを用意します。
説明されている動作を実装するための適切な設計パターンは何ですか?どのように機能しますか?