私の最初のアイデアは、余分なレベルの間接化を導入することです。CarStop
実際のオブジェクトとオブジェクトの代わりに、Car
コントロールをプロキシ オブジェクトのサブスクライバーにすることができます (同じインターフェイスを実装します)。プロキシ オブジェクトは、"本当の" バディを認識し、バディが新しいものに置き換えられたときにバディへの参照を更新できます。 .
interface ICarStop {
void addObserver(CarStopObserver observer);
void removeObserver(CarStopObserver observer);
}
class CarStopControl implements CarStopObserver {
public void update (ICarStop obj, Object arg) {
// ...
}
}
class CarStopProxy implements ICarStop {
ICarStop original;
public CarStopProxy(ICarStop original) {
this.original = original;
}
public void setOriginal(ICarStop original) {
this.original = original;
}
public void addObserver(CarStopObserver observer) {
// ...
}
public void removeObserver(CarStopObserver observer) {
// ...
}
public void notifyObservers(Object object) {
// iterate through observers an update each
}
}
class CarStop implements ICarStop {
CarStopProxy proxy;
public CarStop(CarStopProxy proxy) {
this.proxy = proxy;
}
public CarStop(CarStop other) {
// copy all properties
this.proxy = other.proxy;
}
public CarStopProxy getProxy() {
return proxy;
}
public void setProxy(CarStopProxy proxy) {
this.proxy = proxy;
}
public void handleChange() {
proxy.notifyObservers(...);
}
}
CarStop オブジェクトを置き換える必要がある場合は、次のように記述します。
CarStop newCarStop = new CarStop(oldCarStop);
// update all references to point to the new object
oldCarStop.setProxy(null);
別の可能性は、Mediatorを導入することです。これは、モデル オブジェクトをある種の識別子 (具体的なアドレス/参照とは異なるため、変更される可能性があるため) で識別できます。この場合、CarStop
オブジェクトが別のオブジェクトに置き換えられると、新しいオブジェクトは前のオブジェクトの ID を引き継ぎ、それを更新メッセージで使用します。
class CarStop implements ICarStop {
Mediator mediator;
Long id;
public CarStop(Mediator mediator) {
this.mediator = mediator;
}
public CarStop(CarStop other) {
// copy all properties
this.mediator = other.mediator;
}
public void handleChange() {
mediator.notifyObservers(id, ...);
}
}
CarStop newCarStop = new CarStop(oldCarStop);
// update all references to point to the new object