Ben var class Car
2 özelliklere sahip olan: int price
ve boolean inStock
. Ayrıca tutan List
bir abstract class State
(boş sınıfa). Arabaya uygulanabilen 2 durum vardır ve her biri kendi sınıfıyla temsil edilir: class Upgrade extends State
ve class Shipping extends State
.
A Car
, 2 durumun her birinin herhangi bir sayısını tutabilir. Eyaletler aşağıdaki kurallara sahiptir:
Upgrade
:1
arabanın kendisine uygulandığı her eyalet için fiyat ekler .Shipping
:Shipping
listede en az 1 durum varsainStock
, olarak ayarlanırfalse
.
Örneğin, price = 1
ve ile başlayarak 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
Her ekleme ve çıkarma işleminin gözlemcileri bilgilendirdiği gözlemci modelini düşünüyordum. Aklımda böyle bir şey vardı, ama verdiğim kurallara uymuyor:
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çıkçası, bu işe yaramıyor. A Shipping
kaldırıldığında, bir şeyininStock
false olarak başka bir durum ayarı olup olmadığını kontrol etmesi gerekir, bu nedenle kaldırılması Shipping
sadece olamaz inStock = true
. her çağrıda Upgrade
artar price
. Daha sonra varsayılan değerler için sabitler ekledim ve bunlara dayalı bir yeniden hesaplama girişiminde bulundum.
Hiçbir şekilde herhangi bir model dayatmaya çalışmıyorum, sadece yukarıdaki gereksinimler için bir çözüm bulmaya çalışıyorum. Uygulamada Car
birçok özellik içerdiğini ve bu şekilde uygulanabilecek birçok durum olduğunu unutmayın. Bunu yapmanın birkaç yolunu düşündüm:
- Her gözlemci aldığından
Car
, şu anda kayıtlı olan diğer tüm gözlemcilere bakabilir ve buna göre bir değişiklik yapabilir. Bu tür gözlemcileri dolaştırmanın akıllı olup olmadığını bilmiyorum. - Bir gözlemci eklendiğinde veya kaldırıldığında
Car
, bir yeniden hesaplama olacaktır. Ancak, bu yeniden hesaplama , yeni eklenen / kaldırılandan bağımsız olarak tüm gözlemciler üzerinde yapılmalıdır . - Ekleme ve kaldırma yöntemlerini çağıran ve yeniden hesaplamayı gerçekleştirecek harici bir "yönetici" sınıfınız olsun.
Açıklanan davranışı uygulamak için iyi bir tasarım modeli nedir ve nasıl çalışır?