2013-08-16 6 views
1

이벤트를 발생시킨 컨트롤이 아닌 포커스를받은 컨트롤에서 작동해야하는 이벤트가 발생하면 어떻게 처리할까요? 중재자 (MGM) 패턴? 두 개 이상의 모델이있는 경우이 질문이 밀접하게 관련된 MVP pattern에도 적용됩니다.Model-GUI-Mediator 패턴 (MVP 일 수도 있음)으로 이벤트 위임

이벤트 생성 컨트롤의 조정자가 선택한 컨트롤 (또는 모델)의 조정자에게 이벤트를 위임해야한다고 생각하기 때문에 '위임 이벤트'라고 제목을 붙였습니다.하지만 질문은 '어떻게?'입니다.

배경

MGM 패턴은 각 제어 (폼 당보다는 한 발표자)에 대해 별도의 '중재자'를 가질 것을 제외하고, 조금 MVP Passive View 같다. 컨트롤의 이벤트는 모두 중개자에 의해 처리되며 조정자는 특정 모델의 메서드를 호출하여 호출합니다. 조정자는 모델의 observer이며 모델 변경시 제어를 업데이트합니다. 특히 컨트롤에 데이터 바인딩이없고 하위 클래스를 원하지 않는 RAD 환경에 적합합니다. 또한 Passive View와 달리 이벤트 연결을위한 상용구 코드가 거의 없다는 장점이 있습니다. 여기서 두 더 자세한 설명은 다음

증상 례 A 형 모델의 수에 대한보기를 제공하는 컨트롤들을 포함

  1. 사물. 한 번에 하나의보기 만 선택할 수 있습니다. (뭔가 구체적인 것을 원한다면 다중 문서 편집기를 상상해보십시오.)

  2. 사용자가 메뉴에서 명령을 호출합니다. 특정 메뉴 항목의 조정자 개체에서 Execute 메서드를 호출합니다. 메뉴 항목은 컨트롤이므로 해당 조정자가 있습니다.

  3. 명령은 현재 선택한 컨트롤에서 작업을 수행해야합니다.

  4. 따라서 메뉴 항목의 조정자는 선택한 컨트롤에 속한 조정자를 찾고 해당 컨트롤을 위임해야하거나 선택한 컨트롤의 조정자와 연결된 모델을 찾아 직접 호출해야합니다.

그러나 메뉴 항목의 조정자가 선택한 컨트롤의 조정자를 어떻게 찾습니까?

MGM에서 mediator 객체는 자체 포함되어 있으므로 다른 mediator 객체에 대해서는 알지 못합니다. 컨트롤은 모델에 대해 아무 것도 알 수 없으므로 (명확한 관심사 분리를 유지하기 위해). 컨트롤이 중재자에 대해 아는 유일한 것은 이벤트 처리기입니다.

해키 해결

내가 지금까지 가지고 올 그 컨트롤의 중재자에 객체 메소드 포인터 될 것입니다 선택한 컨트롤에 이벤트 필드를 검사하는 것 중에 최고. 델파이에서 이것을 TMethod에 캐스트 할 수 있으므로 컨트롤의 조정자에 대한 객체 포인터를 추출 할 수 있습니다.그런 다음이를 중재자 유형으로 캐스팅하고 필요한 방법을 호출 할 수 있습니다.

그러나 이것은 언어 기능 (TMethod)에 크게 의존하고 또한 중재자 클래스 간의 종속성을 생성합니다.

는 아마도 내가

(PS 나보다 더 담당자와 함께 누군가가 "모델의 GUI-중재자"태그를 만들시겠습니까? 감사합니다.) ... 완전히 잘못된 트랙에있어

답변

2

이런 경우 누군가에 미래에이 질문을 볼 때, 저는 '공식적인'대답을 발견했습니다.

MGM (및 수동보기)에서 모델에는 필요한 모든 상태 정보가 포함되어 있다고 가정합니다. 따라서이 경우 애플리케이션 모델은 포커스가있는 컨트롤을 추적합니다.

다중 문서 편집기의 예에서 다양한 메뉴 명령 을 처리하고 현재 포커스가있는 편집기를 추적하는 응용 프로그램 모델이 있습니다.. 초점을 맞춘 편집기에 해당하는 편집기 모델로 작업을 위임하는 것은 쉽습니다.

(사실 이것은 내가 채택한 해결책이 아닙니다. 상태 정보가 이미 GUI에 포함되어 있었고 모델에서이 정보를 복제하고 싶지 않았습니다. 둘 이상의 장소에서 동일한 정보를 항상 유지하는 것은 서투른 것처럼 보입니다. 와 불일치를 도입하기위한 매우 바람직하지 가능성이있다. 이것은 아마도 어쨌든, 내가 질문에 설명 된 '해키'해결 방법으로 갔다. 같은 MGM 및 수동보기와 같은 패턴 중 하나 약점입니다.)


마찬가지로 각주,이 상황을 처리하는 또 다른 방법 - 컨트롤이 많은 기능을 처리하고 모델에서 복제하고 싶지 않지만 모델에 액세스해야하는 상태 -는 기능/상태에 액세스해야 할 때 호출 할 수있는 모델의 이벤트를 정의합니다. 이벤트를 사용하면 MGM의 기본 요구 사항 인 raison-detre 인 모델에서 중재자 종속성을 유지할 수 있습니다.

예를 들어 컨트롤에 내용을 저장할 수있는 기능이있는 경우 모델에서 OnSave 이벤트를 정의하고 조정자가 컨트롤의 저장 기능을 호출하는 처리기를 연결하게하십시오. 모델의 Save 메소드는 이벤트를 호출하고, 컨트롤은 모델이 그것에 대해 알 필요없이 구현을 처리합니다.