[번역] 서로 다른 Observer 모드 의 실현

원문 링크: 서로 다른 Observer 패턴 구현 간 의 비교
아래 의 비 교 는 구독, 게시 이벤트, 이벤트 모니터 삭제 에 관 한 기본 적 인 특성 일 뿐이다.주로 각종 기본 개념 을 바탕 으로 하 는 실현 상의 차이 와 그들의 사용 상의 장단 점 이지 사용 가능 한 특성 이 아니다.일부 단점 으로 표 시 된 부분 은 '좋 은 실현' 이나 'hack' 를 통 해 피 할 수 있 지만, 일반적으로 이러한 단점 은 존재 한다.
모든 실현 은 하나의 디자인 모델 (Observer) 을 바탕 으로 같은 임 무 를 완성 했다. 그들 은 공통점 이 많 지만 운영 방식 은 약간 다르다.본 고 는 주로 당신 이 당신 에 게 가장 적합 한 업무 흐름 과 당신 이 해결 해 야 할 문제 의 종 류 를 선택 하 는 것 을 돕 기 위해 서 입 니 다.
Event Emitter/Target/Dispatcher
  • 모든 사용자 정의 이벤트 의 대상 은 EventEmitter / EventTarget / EventD spatcher 에서 계승 하거나 특정한 인 터 페 이 스 를 실현 해 야 합 니 다.
  • 문자열 로 이벤트 형식 을 정의 합 니 다.
  • DOM 2 / DOM 3 Events 는 바로 이런 모델 을 바탕 으로 한다.

  • 코드 예제
      myObject.addEventListener('myCustomEventTypeString', handler);
      myObject.dispatchEvent(new Event('myCustomEventTypeString'));
      myObject.removeEventListener('myCustomEventTypeString', handler);

    장점.
  • target object 에 대해 완전한 통 제 를 가지 고 특정한 target 이 보 낸 사건 만 감청 하도록 확보한다.
  • target object 를 수정 하지 않 고 임의의 이벤트 형식 을 보 낼 수 있 습 니 다.
  • 모든 target / object / event 는 같은 방법 을 사용 합 니 다.
  • 코드 는 이해 하기 쉽다.
  • 사건 의 target 은 보통 object 자체 로 사건 의 거품 을 더욱 논리 적 으로 만든다.
  • 유행.

  • 결점.
  • 그룹 이 아 닌 계승 을 사용 하 는 경향 이 있다.
  • 문자열 로 이벤트 형식 을 정의 하면 맞 춤 법 오류 가 발생 하기 쉽 고 IDE 가 자동 으로 잘 작 동 하지 않 습 니 다.
  • Event handler 는 보통 하나의 인자 (Event Object) 만 받 습 니 다.
  • 추가 데 이 터 를 전달 하려 면 특정 인 터 페 이 스 를 실현 하 는 사용자 정의 이벤트 대상 을 만 들 거나 기본 적 인 이벤트 대상 을 확장 해 야 합 니 다. 이 과정 은 번 거 롭 고 불편 합 니 다.


  • Publish / Subscribe (pub/sub)
  • 같은 대상 을 이용 하여 여러 구독 자 에 게 소식 을 방송한다.
  • 필요 한 조건 은 아니 지만 대부분 정적 집중 대상 을 방송 자로 사용한다.

  • 문자열 로 이벤트 형식 을 정의 합 니 다.
  • 소식 과 사건 의 목표 사이 에는 관계 가 없다.

  • 코드 예제
      globalBroadcaster.subscribe('myCustomEventTypeString', handler);
      globalBroadcaster.publish('myCustomEventTypeString', paramsArray);
      globalBroadcaster.unsubscribe('myCustomEventTypeString', handler);

    장점.
  • 임의의 대상 이 모든 이벤트 유형 을 구독 / 발표 할 수 있 습 니 다.
  • 라이트급.
  • 사용 하기 쉽다.

  • 결점.
  • 임 의 대상 이 모든 이벤트 유형 을 구독 / 게시 할 수 있 습 니 다 (네, 장점 이자 단점 입 니 다).
  • 문자열 로 이벤트 형식 을 정의 합 니 다.
  • 실수 하기 쉽다.
  • 자동 으로 완성 되 지 않 았 습 니 다. (value 를 변수 / 상수 로 저장 하지 않 는 한)
  • 잘못된 구독 자 에 의 해 메시지 가 차단 되 지 않도록 명명 규범 을 통 해.


  • Signals
  • 모든 사건 유형 은 자신의 컨트롤 러 가 있다.
  • 이벤트 형식 은 문자열 에 의존 하지 않 습 니 다.

  • 코드 예제
      myObject.myCustomEventType.add(handler);
      myObject.myCustomEventType.dispatch(param1, param2, ...);
      myObject.myCustomEventType.remove(handler);

    장점.
  • 문자열 에 의존 하지 않 습 니 다.
  • 자동 완성 으로 정상 적 인 작업 을 할 수 있다.
  • 존재 하지 않 는 이벤트 유형 을 보 내 거나 감청 하면 오류 가 발생 합 니 다 (오 류 를 일찍 발견 할 수 있 습 니 다).
  • 문자열 값 을 저장 하기 위해 상수 만 들 필요 가 없습니다.

  • 모든 모니터 와 사건 유형 을 세밀 하 게 제어 한다.
  • 모든 signal 은 특정한 목표 / 용기 입 니 다.

  • 대상 이 보 낸 signal 을 쉽게 정의 합 니 다.
  • 계승 보 다 는 조합 을 사용 하 는 경향 이 있다.
  • 원형 체인 과 헷 갈 리 지 마 세 요.


  • 결점.
  • 임의의 유형의 사건 을 파견 할 수 없다.(이것 은 대다수 상황 에서 도 장점 이다)
  • 모든 사건 유형 은 대상 구성원 이다.(이것 은 대다수 상황 에서 도 장점 이다)
  • 사건 유형 이 많 으 면 네 임 스페이스 가 혼 란 스 러 워 지기 쉽다.

  • 이벤트 형식 과 대상 을 콜 백 에 전달 하지 않 아 일반적인 handler (여러 이벤트 형식 과 목표 에서 작업) 를 사용 하기 어렵 습 니 다.
  • 대부분의 사람들 이 사용 하 는 것 과 다르다.

  • 결론.
    생활 속 의 대다수 와 마찬가지 로 모든 해결 방안 은 장점 과 단점 을 가지 고 있다.어떤 방식 이 가장 적합 한 지 결정 하 는 것 은 너 에 게 달 려 있다.나 는 본문 이 네가 결정 할 때 너 를 도 울 수 있 기 를 바란다.다시 한 번 해결 방안 이 없 는 것 은 만능 이다.

    좋은 웹페이지 즐겨찾기