2009-12-18 4 views
0

임 디자인 문제로 약간 어려움을 겪고 있습니다. 나는 C#에서 매우 간단한 GUI 시스템을 만들고있다. 이 코드는 재사용이 가능하기 때문에 여기에서 가장 유연한 솔루션을 찾고 있습니다. 내가 생각해내는 해결책에는 모두 단점이있는 것 같습니다.이벤트 기반 통신 설계시 문제가 발생했습니다.

간단히하기 위해 컨트롤러, 버튼 및 클라이언트 코드의 세 가지로 가장 할 수 있습니다. 클라이언트 코드는 gui 시스템을 사용하는 코드입니다. 컨트롤러를 만들고 Update()를 호출합니다. 컨트롤러는 많은 버튼 인스턴스를 만들고 Update()를 호출합니다. 단추가 그려지고 마우스 클릭이 있는지 확인합니다.

이제 문제는 클라이언트 코드에 단추가 클릭되었다는 사실을 얻는 것입니다.

옵션 1 : GetButton (문자열 이름)을 컨트롤러 클래스에 추가하십시오. 그런 다음 클라이언트 코드는 버튼 클래스 => GetButton ("but")에 정의 된 이벤트에 가입 할 수 있습니다. 단점은 Button.Update()가 컨트롤러에 의해 사용되어야한다는 것입니다.

옵션 2 : 컨트롤러를 모든 버튼에 가입시키고 클라이언트 코드를 컨트롤러에 가입시킵니다. 여기에있는 단점은 클라이언트 코드에서 더 많은 코드를 파싱하는 것입니다. 이제는 모든 이벤트가 컨트롤러를 통해 퍼널됩니다. 따라서 클라이언트는 각 이벤트를 보낸 단추를 확인해야합니다. 옵션 1처럼 초기화 단계에서 이벤트 흐름을 설정하는 것을 선호합니다.

옵션 3 : 각 이벤트 (SubscribeMouseUp (string buttonName, GUIDelegate del) 등)에 대한 컨트롤러에 Subscribe/Unsubscribe 메소드를 추가하십시오. 컨트롤러 API가 빠르게 커집니다.

그래서 지금은 옵션 1쪽으로 기울어 져 있지만 GetButton은 이벤트를 선언하여 클라이언트에서 Update()를 숨기는 인터페이스 (IClientButton 어쩌면)를 반환하지만 인터페이스가 있어야하는 방법인지 확실하지 않습니다. 익숙한.

모든 의견에 감사드립니다. Bas

답변

0

Update()은 공개되었으므로 아마도 문제 일 수 있습니다.

버튼과 컨트롤러를 동일한 네임 스페이스에 구성했다고 가정 할 경우 internal 보호가 필요합니까?

0

그런 식으로 인터페이스를 사용할 수 있습니다. INotifyPropertyChanged는 이벤트 인 1 개의 항목이있는 인터레이스입니다.

약 사용 RoutedEvents?

0

네 번째로 인기있는 옵션이 있습니다.

디스패처를 등록/등록 취소의 중심 위치로 지정하십시오. 모든 이벤트 수신자는 디스패처에 콜백을 등록합니다. 모든 이벤트 생성기는 이벤트를 디스패처로 보냅니다.

API를보다 깨끗하게 유지하고 객체 참조를 해체하는 데 도움이됩니다.

0

컨트롤러에 두 개의 이벤트 - ButtonCreatedButtonDestroyed을 추가하십시오. ClientButtonEventArgs

public event EventHandler<ClientButtonEventArgs> ButtonCreated; 
public event EventHandler<ClientButtonEventArgs> ButtonDestroyed; 

단순히 IClientButton 인터페이스 주위에 EventArgs 래퍼입니다.

클라이언트 코드가이 두 가지 이벤트를 모두 구독하도록하십시오. 컨트롤러가 새 버튼을 만들면 ButtonCreated 이벤트를 발생 시키십시오. 클라이언트 코드는 이벤트 통지를 수신 할 때 필요한 Button 이벤트에 등록 할 수 있습니다. 마찬가지로 컨트롤러는 필요에 따라 ButtonDestroyed 이벤트를 발생시켜 클라이언트 코드가 Button의 이벤트를 구독 취소 할 수 있도록합니다.

이렇게하면 전체 시퀀스가 ​​이벤트 기반으로 처리됩니다. 클라이언트 코드 과 버튼의 생성 및 제거에 반응합니다.

관련 문제