我有一些积分(停车位)代表时间图表。 这些点通过线连接在它们之间。 Points + Lines代表Graph(即汽车时刻表)。可以使用鼠标及时移动CarStops来修改图表。
我决定将Points和Lines作为控件实现(想想在面板上移动它们会更容易)。
我有两个业务对象层 - Real BO(CarStop
)和GUI Control(CarStopControl
)。
我将CarStop
(时间,电台)关联到CarStopControl
(X,Y) - CarStopControl订阅了CarStop.Moved事件。< / p>
最后,Car
对象有一些CarStop
s。
dX
,
在dX
中转换dTime
Car.Move(dTime)
- 移动所有CarStop。
移动CarStop
后,将事件发送到CarStopControl
,后者更改其坐标。这样CarStopControl
似乎跟随鼠标移动。这就是全部。
问题出现在Car.Move
需要重新创建CarStop
集合时,CarStopControl
和CarStop
之间的链接显然变为过时的,汽车BO Car
和CarStop
并不关心甚至不了解CarStopControl
。
类似的情况是Car
本身可以被new Car
取代。
有类似的情况吗?是否存在+的“解决方法” - 快速解决此问题?
感谢。
答案 0 :(得分:0)
我的第一个想法是引入一个额外的间接层。您的控件可以是代理对象的订阅者(实现相同的界面),而不是真正的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