2010-11-19 4 views
2

소스에서 발표자까지 항목 모음을 전달하는 솔루션이 있습니다. 소스가 업데이트되면 발표자에게 새로운 결과를 표시 할 수 있기를 원합니다.변경 알림 (이벤트 또는 대리자)에 가장 적합한 패턴

마음에 떠오르는 점은 ChangeNotification 클래스를 만들어 결과와 함께 전달하고 해당 클래스에서 발표자에게 알리도록하는 것입니다. 이제는 두 가지 방법으로 구현할 수 있습니다. ChangeNotification에는 발표자가 구독하는 이벤트가 있거나 발표자가 설정하는 위임자와 null이 아닌 경우 소스 호출이있을 수 있습니다.

이벤트 사용의 이점은 소비자가 알림에 반응 할 수 있고 이에 대한 사후 대응 확장을 할 수 있다는 것입니다. 단점은 적절한 가비지 수집을 위해 이벤트 가입/탈퇴를 관리해야한다는 것입니다. 대의원은 간단하지만 유연성이 떨어집니다.

이런 상황에서 가장 우아한 패턴은 무엇입니까? 내가 생각하지 못한 다른 방법이 있습니까?

답변

3

여러 명의 옵저버가있을 경우 이벤트 또는 다중 등급이 필요합니다. 관찰자가 한 명 뿐이고이를 시행하기를 원한다면 대의원이 충분할 것입니다. 그러나 어느 것이 가장 좋은지에 관해서는, IMHO는 이벤트가보다 융통성이 있으며 그 패턴에 매우 잘 맞다고 말할 것입니다. ObservableCollection 및 INotifyPropertyChanged는 이벤트 기반 구현입니다. 그건 그렇고,이 클래스에 대한 참조는 tbischel에 +1합니다.

2

이 장면에는 두 가지 패턴이 있습니다.

먼저 INotifyPropertyChanged 인터페이스를 구현할 수 있습니다. 발표자에게 컬렉션의 개체 자체의 속성에 대한 변경 사항을 알리려면이 방법이 좋습니다. (또는 소스 객체 자체가 변경이 발생한 경우 해당 객체 자체).

두 번째 것은 발표자에게 객체가 포함 된 ObservableCollection을 전달하는 것입니다. 발표자에게 항목이 컬렉션에 추가되거나 컬렉션에서 제거되었음을 알리려는 경우에 더 좋습니다. 둘 다 모든 구독자가 연결할 수있는 이벤트 기반 모델입니다.


편집 : 기본이되는 패턴은 당신이 원하는 경우에 당신은, 당신은 자세한 내용은 아래가 자신의 버전을 출시 가능 대상 "Observer" 패턴이다.

+0

INotifyPropertyChanged를 구현하면 IBindingList 또는 ObservableCollection에 포함될 때 클래스가 많은 WindowsForms 또는 WPF 컨트롤에 데이터 바인딩 할 준비가됩니다.대리인은 추가 작업없이이 기능을 사용하지 않습니다. – cordialgerm

+0

답변을 주셔서 감사합니다. 이러한 컬렉션은 주로 wpf/windows 양식으로 작업하는 경우 유용합니다. – Homde

+0

그들은 "관찰자"디자인 패턴의 특정 구현입니다 ... 그리고 Winforms 및 WPF에 바인딩하는 컨트롤에 대한 무료 업데이트를 얻는 동안, 그들은 여전히 ​​매우 유용합니다. UI가 아닌 상황. – tbischel

0

INotifyPropertyChanged, INotifyCollectionChanged 및 기타 관련 인터페이스가 첫 번째 속성으로 돌아가지만 관찰자 패턴을 구현하는 세 번째 옵션을 추가하고 싶다는 다른 답변에 동의합니다. 이 패턴에 익숙하지 않은 사용자라면 event listeners을 통해 Java가 이벤트 기능을 구현하는 방법을 알 수 있습니다. 이 패턴을 C#에서 채택 할 수없는 이유는 없지만 어떤 경우에는 이해 관계자가 일반적으로 모두 가입 한 여러 조정 이벤트가있을 때 이벤트 및 위임을 사용하는 것보다 더 훌륭한 해결책을 제공 할 수 있습니다.

또 다른 옵션은 기본 제공되고 WPF에 최적화 된 변경 알림을 얻기 위해 DependencyObject에서 파생되고 DependencyProperties를 구현하는 것입니다. 특정 기본 클래스가 있어야한다는 요구 사항을 좋아하지 않기 때문에이 방법을 사용하지 않는 편이 낫습니다. 그러나 때로는 올바른 선택인지, 실제로 일부 MVVM 프레임 워크는 변경 알림의 기초로 사용하기도합니다. ViewModel 클래스도 마찬가지입니다.