2010-03-01 3 views
0

나는 시간 그래프에서 나타낼 포인트 (차 정류장)가있다. 이 포인트는 라인별로 연결됩니다. 점 + 선은 그래프 (즉, 자동차 일정)를 나타냅니다. CarStops를 마우스로 제 시간에 움직여 그래프를 수정할 수 있습니다.BO와 GUI 간의 링크가 끊어졌습니다. 무엇을해야합니까?

지점 및 선을 컨트롤로 구현하기로 결정했습니다 (패널에서 이동하기가 더 쉽다고 생각했습니다).

두 개의 비즈니스 오브젝트 계층 (Real BO (CarStop) 및 GUI 제어 (CarStopControl))이 있습니다. 다음과 같이 연결합니다. CarStop(시간, 스테이션) ~ CarStopControl(X, Y) - CarStopControl은 CarStop.Moved 이벤트를 구독합니다.

마지막으로 Car 개체의 값은 CarStop입니다.

  • 컨트롤을 어떻게 이동합니까? 간단히 : 패널에서 마우스를 움직여 dX, dXdTime Car.Move(dTime)으로 변환하면 모든 CarStops가 이동합니다. CarStop이 이동하면 CarStopControl으로 이벤트를 보내고 후자는 좌표를 변경합니다. 이런 식으로 CarStopControl 마우스 움직임을 따르는 것 같습니다.

이것은 모두입니다. CarStopControlCarStop 사이의 링크 분명히, 자동차 BO CarCarStop 상관도도에 대한 CarStopControl의를 모르는 쓸모가되었다 - Car.MoveCarStop 수집을 다시 할 필요가있을 때


문제 등장.

Car 자체를 new Car으로 바꿀 수있는 유사한 상황이 있습니다.

누군가 비슷한 상황이 있었나요? 거기에 +의 "해결 방법"이 -이 문제를 신속하게 해결?

감사합니다.

답변

0

첫 번째 아이디어는 추가 수준의 간접 참조를 소개하는 것입니다. 실제 CarStopCar 개체 대신 컨트롤이 프록시 개체 (동일한 인터페이스 구현)의 구독자 일 수 있으며,이 개체는 차례로 자신의 "실제"대화 상대를 알고 후자가 대화 상대로 바뀌면 해당 대화 상대에게 참조를 업데이트 할 수 있습니다 새로운. 당신이 CarStop 객체를 교체해야하는 경우 이제

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

는의 대신 내가 myCarStopProxy을 도입 CarStopControl에 myCarStop의 가정 해 봅시다 ICarStop을 구현합니다. 이제 나는 CarStop을 조정한다. CarStopProxy는 어떻게 알 수 있습니까? BO 또는 GUI 레이어에서 프록시는 어디에 만들어야합니까? – serhio

+0

ID가 내 차에 있습니다. 차가 데이터베이스에서 가져옵니다. 자, 중재자, carStopProxy와 같이, 어디서 만들어 지는지. 이제는 carStop 재설정에 대한 정보를 얻었습니다. – serhio

+0

@serhio 코드 예제를 추가했습니다. –

관련 문제