11

현재 Design Patterns에 관한 수업을 진행 중입니다. EventListenerObservable일까요?EventListener를 관찰 할 수 있습니까?

두 사람 모두 구독자 목록을 갖고있어 변경된 내용이 있으면 구독자에게 알리기 때문에 별 차이가 없습니다.

+4

나는 이벤트 리스너가 옵서버라고 말하고 싶습니다. 그렇지 않습니까? –

+0

[옵저버 디자인 패턴 vs "리스너"] (https://stackoverflow.com/questions/3358622/) – sepehr

답변

13

Observable은 단순히 동작을 관찰 할 수있는 개체입니다. 따라서 어떤 행동을 듣고 행동이 일어난다는 말을들을 수있는 곳은 Observable입니다.

이것은 이벤트 수신기가 하나임을 의미합니다. 당신은 사건을 경청 할 수 있고 사건은 즉시 일어났다 고 당신에게 알립니다.

개인적으로 누군가가 말하면 Observable 나는 사건을 생각합니다. 이것은 내 관찰 쿠키가 내 쿠키 커터의 예입니다. 비슷한 예가 다른 이름의 이벤트 인 미공개 구독 시스템입니다 (미묘하게 다른 사용 사례가 있음).

0

네, 특정 이벤트에 대한 리스너를 등록하는 이벤트 대기열은 Observer Pattern의 예입니다.

2

나는 JDK의 소스 코드를 조사하여 좀 더 연구를 해왔다. 그들 사이의 유일한 차이는 Observers을 추가 할 때 Observable이 동기화되고 EventListener이 없다는 것입니다 (적어도 AbstractButton은 그렇지 않습니다).

8

내 경험에 비추어 볼 때, 이벤트 리스너 패턴은 ​​옵저버 디자인 패턴과는 다른 것입니다. 그것은 단지 다른 이름이 아니거나 그 일부입니다.

나는 이것에 대해 구체적으로 이야기해야합니다. 예를 들어,이 page은 이벤트 리스너 시스템의 C# 구현을 제공합니다. 이 시스템에서 리스너는 이벤트 핸들링 함수를 싱글 톤 클래스 Events에 등록하고 특정 유형의 이벤트를 처리 할 수 ​​있다고 주장합니다. Events은 각 유형의 이벤트를 핸들러 함수에 맵핑하는 사전을 유지 보수합니다. 반면에 이벤트를 트리거하려는 클래스는 싱글 톤의 함수 Events.instance.Raise()을 통해 그렇게해야합니다. 여기

우리는 3 개 차이를 볼 수 있습니다

를 우선 두 패턴의는 다른 목적 : 리스너 디자인 패턴이 때, 그래서 코드를 이벤트 처리에서 코드를 높이는/이벤트 감지를 분리하는 것입니다 새로운 이벤트 처리 코드를 변경하거나 추가하는 경우 다른 이벤트 처리 코드에는 영향을 미치지 않습니다. Observer Design Pattern은 다른 객체의 변경 사항을 따르는 객체를 만드는 것입니다.

데이터 구조도 다릅니다. Listener Design Pattern에는 각 이벤트 유형을 처리 방법에 매핑하는 전역 사전이 하나만 있습니다. 이 매핑은 1 대 1입니다. 옵저버 패턴에서 관찰 된 모든 피사체는 옵서버 목록을 유지합니다. 이 매핑은 일대 다입니다. 하나는 많은 옵저버에게 적용됩니다. 그러한 1 대 다수 피사체 옵서버 관계의 인스턴스가 여러 개있을 수 있습니다.

동작이과 다릅니다. 리스너 디자인 패턴에서 이벤트가 발생하면 이벤트 레이서는 이벤트 처리기에 대한 정보가 없으므로 전역 조정자 (단일 사용자 Events.instance)에 알립니다. 옵저버 패턴 (Observer Pattern)에있는 동안, 어떤 변화가 일어날 때, 관찰 된 피험자는 모든 옵서버에게 직접 통보합니다.

관련 문제