Моя первая идея - ввести дополнительный уровень косвенности. Вместо реальных 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
заменяется другим, новый объект просто берет идентификатор своего предшественника и использует его в своих сообщениях об обновлении:
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