2010-12-09 4 views
0

대리자가없는 Java에서는 이벤트가 관찰자 패턴 다음에 인터페이스 콜백으로 모델링됩니다. 6 개 이상의 이벤트가있는 프레임 워크에서 작업하는 경우 대리인을 사용하는 것이 매우 장황하게됩니다.대리인을 통해 인터페이스 기반 콜백/이벤트가 사용됩니까?

자신의 C#을 잊어 버린 Java 개발자로서 이벤트 용 인터페이스를 사용하는 데 유효한 이유가 있는지 또는 정말 대리인을 사용해야하는지 여부가 궁금합니다.

답변

2

항상 여러 콜백에 반응하는 것이 좋은 경우 인터페이스를 사용하는 것이 좋습니다. 그러나 콜백의 일부 (원하는 인터페이스 만)에 대한 대리자를 제공하여 인터페이스를 구현할 수 있도록 일부 어댑터 메소드를 작성할 수 있습니다. Reactive Extensions 작품 ... 거의 아무도 이제까지 정말IObserver<T>를 구현하지 어떻게

이입니다 - 그들은 호출자가 대표를 통해 OnNext, OnCompletedOnError 핸들러를 지정할 수 있습니다 IObservable<T>.Subscribe 확장 방법을 사용합니다.

위와 같은 방법으로 델리게이트 (일반적으로 인터페이스보다 람다 식으로 지정하기가 더 쉽습니다.)뿐만 아니라 모든 관련 콜백을 전달할 수있는 일관된 객체를 얻을 수 있습니다.

+0

흥미 롭습니다. 그러나 아직 이해할 수있는 조금 이론적입니다. 그렇다면 다음 콜백 정의가 아닌 델리게이트를 사용하는 접근 방법은 무엇입니까? public interface IPluginEvents { void OnLoad (IPlugin plugin); void OnShow (IPlugin plugin); bool CanUnload (IPlugin plugin); void OnUnload (IPlugin plugin); } –

+0

글쎄, 한 가지 옵션은 생성자에서 대리자를 가져온 인터페이스를 구현하는 클래스를 갖거나 ... 유창한 인터페이스 인 WithLoadHandler (...). WithShowHandler (...) 추가 처리기로 클래스의 새 인스턴스를 작성했습니다. 확실하지 않다. 지옥, 심지어 그냥 정상적인 이벤트를 사용할 수 있으며, 이벤트 처리기를 호출하여 인터페이스를 구현합니다. –

0

참석자는 훨씬 유연합니다. C#에는 익명의 클래스가 없으므로 (Java의 의미에서) 인라인 인터페이스를 쉽게 구현할 수 없습니다. 따라서 API에서 인터페이스를 구현해야 할 때마다 람다와 대조적으로 클래스를 작성해야합니다.이 클래스는 서로 물리적으로 멀리 떨어져 논리를 분리해야하기 때문에 가독성이 떨어집니다.

관련 문제