2009-12-26 3 views
0

하나의 메소드에서 GUI 변경 이벤트를 허용하는 리스너 클래스가 있습니다.들어오는 동적 유형에 따른 직접적인 흐름

들어오는 이벤트 개체에는 GUI 이벤트 유형의 수퍼 클래스가 있으며 동작은 들어오는 변수의 동적 유형에 따라 달라집니다.

handleGUIEvent(EventChangedX event) 
handleGUIEvent(EventChangedY event) 

나는 하나의 이벤트 리스너를 사용하여 다양한 유형의 오브젝트를 수신하지만 동작이 각각 달라야하고 있습니다 :

내가 좋아하는 방법을 많이 수행하고 싶었다. 너는 무엇을 할 것이냐?

switch 명령문을 사용하고 싶지 않아 유지 관리가 어려울 수 있습니다.

답변

0

GUIEvent는 유형

delegateEvent(EventListener el) 

이 메소드를 구현해야 각각의 서브 클래스의 추상 메소드를 제공하고, EventListener의 특정 방법에 다시 호출해야합니다. 그런 식으로 GUIEvent의 하위 클래스는 EventListener에서 호출 할 대상을 결정할 수 있으며 두 개체 클래스 사이에서 수행 할 작업을 결정할 수 있습니다. 이것은 double-dispatch으로 알려져 있습니다. switch 문과 같은 것을 피할 수 있습니다. 나는의 EventListener가 GUIEvent.delegateEvent에 호출하고 다시의 EventListener에 전화로이를 그려 적이 있지만

는 세 번째 클래스 (예를 들어, EventReceiver을)있을 수없는 이유를 이유가 없다.

delegateEvent(EventReceiver er) 

EventReceiverGUIEvent의 호출 할 수있는 적절한 방법을 구현하는 것이 : 같은 GUIEvent에 추상적 인 방법이 보일 것이다.

+0

이벤트 뒤에있는 아이디어는 처리기에 대해 알 필요가 없다는 것입니다. 따라서이 패턴은 가장 기본적인 UI 이외에는 작동하지 않습니다. –

+0

전혀 보지 못합니다. 위의 예는 이벤트에 행동을 넣고 다른 객체와 공동 작업하여 다형성을 구현합니다. 이 사건들에 대해 당신은 진술되지 않은 가정을하고있는 것 같습니다. –

+0

이 이중 발송은 Visitor 패턴 (GoF)이라고도하지만 ** 다형성으로 처리하려는 유형 계층 구조 **가 안정적 **이고 더 많은 유형을 추가 할 필요가없는 경우에 작동합니다. 유형을 추가하는 경우 리스너에 "방문 메소드"를 추가해야합니다 (다음 : 많은 청취자 -> 문제점). – helios

0

GUI 이벤트의 다양한 하위 클래스에서 수행 할 작업에 대한 지식을 넣을 수 있습니다. 그러나 이것은 표준 모델 - 뷰 - 컨트롤러 패러다임의 "컨트롤러"컴포넌트를 분산시킬 것입니다.

+0

이것은 작동하지 않습니다 : 이벤트의 보낸 사람은 핸들러에 대해 모르기 때문에 정확한 서브 클래스를 인스턴스화 할 수 없습니다. 또한 이벤트 유형별로 단일 처리기로 제한됩니다. –

0

몇 가지 옵션이 있습니다 :

  • 핸들러 클래스를 작성하고 키와 이벤트의 유형 (클래스)와 맵에 각 핸들러를 등록합니다. 이렇게하면지도에서 단일 조회를 수행하여 처리기를 얻을 수 있습니다.
  • handle + 처리하는 이벤트 유형 (예 : handleMouseClick)을 만듭니다. 리플렉션을 사용하여 올바른 핸들러를 찾으십시오.

첫 번째 방법은 아마도 더 간단 할 것이며 훨씬 더 적은 수의 try-catch 일 것입니다.

이에 대한 보조 클래스를 생성하십시오. 도우미 클래스에서 이벤트 클래스의 getSuperClass()을 사용하는 조회를 추가하여 이벤트 상속을 처리 할 수도 있습니다.

Map<Class<?>, IHandler> map; 

public IHandler handler (Event event) 
{ 
    Class<?> current = event.getClass(); 
    while (true) 
    { 
     handler = map.get (current); 
     if (handler != null) 
      return handler; 

     if (current == null) 
      break; 

     current = current.getSuperclass(); 
    } 

    return new DummyHandler(); 
} 
0

여기는 내가 지금까지 해왔으며 잘 작동하는 것 같습니다.

하나의 큰 GUI에 여러 GUI 구성 요소가 포함되어 있지만 이러한 구성 요소 (및 해당 이벤트)는이 프론트 엔드 외부에서 사용 가능해야합니다.

큰 GUI는 관찰자 패턴을 사용하고 GUIController가 할당되어 있습니다. GUIController 인터페이스에는 모든 이벤트에 대한 handleEventName 메소드가 있습니다.

handleEventX(RangeChange changed); 
handleEventY(AlgorithmChange alg); 

하위 구성 요소는 GUI에 대한 조치에 대한 회전 CALL에 (메시지가 I를 통과 할 수있다 switch 문을 통해 자신을 이벤트를 처리하거나 GUIController에 전달할 수있는 큰 GUI까지 전파 대신 실제 이벤트를 사용 생각)