0

時間グラフで表すポイント (車の停留所) がいくつかあります。これらの点は線で結ばれています。点 + 線はグラフ (つまり、車のスケジュール) を表します。グラフは、マウスで CarStops を時間内に移動することで変更できます。

ポイントとラインをコントロールとして実装することにしました (パネル上での移動が簡単になると考えました)。

リアル BO ( CarStop) と GUI コントロール ( CarStopControl) の 2 つのビジネス オブジェクト レイヤーがあります。次に、CarStop(Time, Station)CarStopControl(X, Y)に関連付けます - CarStopControl は CarStop.Moved イベントをサブスクライブします。

最後に、CarオブジェクトにはいくつかCarStopの があります。

  • コントロールを移動するにはどうすればよいですか? 単純に: パネル上でのマウスの動きを検出しdX、変換dXを計算して、dTime Car.Move(dTime)すべての CarStops を移動します。移動するCarStopと、 にイベントが送信されCarStopControl、後者はその座標を変更します。このようCarStopControlにマウスの動きに追従するようです。

これですべてです。


コレクションCar.Moveを再作成する必要があったときに問題発生しました。CarStopCarStopControlCarStopCarCarStopCarStopControl

同様の状況は、Carそれ自体が に置き換えられる可能性がある場合new Carです。

誰かに似たような状況がありましたか?+- この問題をすばやく修正する「回避策」はありますか?

ありがとう。

4

1 に答える 1

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
于 2010-03-01T15:51:31.447 に答える