나는 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
목록에 상태가 하나 이상 있으면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
재 계산이 수행됩니다. 그러나이 재계 산은 방금 추가 / 제거 된 관찰자와 관계없이 모든 관찰자에서 수행해야합니다 . - add 및 remove 메소드를 호출하고 재 계산을 수행하는 외부 "관리자"클래스가 있습니다.
설명 된 동작을 구현하기위한 좋은 디자인 패턴은 무엇이며 어떻게 작동합니까?