2010-03-01 4 views
0

J'ai quelques points (arrêts de voiture) à représenter sur un graphique temporel. Ces points sont reliés entre eux par des lignes. Les points + lignes représentent un graphique (c'est-à-dire un horaire de voiture). Le graphique peut être modifié en déplaçant CarStops dans le temps avec la souris.Le lien entre BO et l'interface graphique est rompu. Que faire?

J'ai décidé d'implémenter des points et des lignes comme contrôles (je pense qu'il sera plus facile de les déplacer sur les panneaux).

J'ai deux couches d'objet métier - Real BO (CarStop) et GUI Control (CarStopControl). J'associe ensuite un CarStop(Time, Station) à CarStopControl(X, Y) - CarStopControl s'abonne aux événements CarStop.Moved. Finalement, un objet Car a quelques CarStop s.

  • Comment déplacer des contrôles? Simplement: Détecter un mouvement de la souris sur le panneau et calculer dX, transformer dX en dTime Car.Move(dTime) - déplace tous les CarStops. Lorsque CarStop a été déplacé, envoyez l'événement à CarStopControl, et ce dernier change ses coordonnées. De cette façon, CarStopControl semble suivre les mouvements de la souris.

C'est tout.


Le problème apparaît lorsque dans Car.Move il y avait un besoin de recréer la CarStop collection - les liens entre CarStopControl et CarStop évidemment est devenu obsolète, voiture BO Car et CarStop ne sait même se soucient pas, ni sur CarStopControl s.

La situation similaire est lorsque Car lui-même pourrait être remplacé par un new Car.

Est-ce que quelqu'un avait des situations similaires? Y at-il une «solution de contournement» de + - résoudre rapidement ce problème?

Merci.

Répondre

0

Ma première idée est d'introduire un niveau supplémentaire d'indirection. Au lieu des vrais objets CarStop et Car, vos contrôles pourraient être des abonnés à des objets proxy (implémentant la même interface), qui à leur tour connaissent leur «vrai» pote et sont capables de mettre à jour la référence à leur pote lorsque celui-ci est remplacé par nouveau.

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(...); 
    } 
} 

Maintenant, quand vous avez besoin de remplacer un objet CarStop, vous écrivez:

CarStop newCarStop = new CarStop(oldCarStop); 
// update all references to point to the new object 
oldCarStop.setProxy(null); 

Une autre possibilité serait d'introduire un Mediator, qui serait en mesure d'identifier les objets du modèle par une sorte d'identifiant (différent de leur adresse/référence concrète, car cela peut changer).Dans ce cas, lorsqu'un objet CarStop est remplacé par un autre, le nouveau prend un peu plus de l'ID de son prédécesseur, et il utilise dans ses messages de mise à jour:

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 
+0

Disons plutôt que de myCarStop dans CarStopControl j'ai présenté myCarStopProxy qui implémente ICarStop. Maintenant, je recteate le CarStop. Comment le CarStopProxy est-il au courant? Où dois-je créer le proxy: dans la couche BO ou GUI? – serhio

+0

J'ai des ID dans mes voitures-carStops de la base de données. Maintenant, Mediator, comme carStopProxy, où il devrait être créé. Maintenant, est-il informé d'une réinitialisation carStop ... – serhio

+0

@serhio J'ai ajouté des exemples de code. –

Questions connexes