BO和GUI之间的链接被破坏。该怎么办?

时间:2010-03-01 15:42:22

标签: .net oop business-logic business-logic-layer

我有一些积分(停车位)代表时间图表。 这些点通过线连接在它们之间。 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集合时,CarStopControlCarStop之间的链接显然变为过时的,汽车BO CarCarStop并不关心甚至不了解CarStopControl

类似的情况是Car本身可以被new Car取代。

有类似的情况吗?是否存在+的“解决方法” - 快速解决此问题?

感谢。

1 个答案:

答案 0 :(得分:0)

我的第一个想法是引入一个额外的间接层。您的控件可以是代理对象的订阅者(实现相同的界面),而不是真正的CarStopCar对象,然后他们知道他们的“真实”伙伴,并且能够更新对他们的朋友,当后者被新的替换。

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