옵저버(Observer)


모듈의 중간에서 서로의 상태 변화를 관찰하는 관찰자 객체를 만드는 패턴

  • 상태변화가 있을 때마다 상대 모듈에게 필요한 데이터와 함께 상태가 변했음을 관찰자(observer)를 통하여 통보(notify)
  • mouseover , keypress와 같은 브라우저 이벤트가 옵저버 패턴의 예
  • 나의 주제(subject 혹은 publisher)를 여러 구독자(observer)가 구독하는 1:N 관계

옵저버객체 생성
var observer = {
  handlers: {},
  // 상태 변화 이벤트가 발생하면 실행될 이벤트를 등록하는 함수를 작성합니다.
  register: function (eventName, handler) {
    var handlerArray = this.handlers[eventName];
    if (undefined === handlerArray) {
        handlerArray = this.handlers[eventName] = [];
    }
    handlerArray.push({ handler: handler, context: context });
  },
  // 등록된 핸들러를 해제하는 함수를 작성합니다.
  unregister: function (eventName, handler, context) {
    var handlerArray = this.handlers[eventName];
    if (undefined === handlerArray)
      return ;
    for (var hidx = 0; hidx < handlerArray.length; hidx++) {
      var currentHandler = handlerArray[hidx];
      if (handler === currentHandler['handler']
       && context === currentHandler['context']) {
        handlerArray.splice(hidx, 1);
        return ;
      }
    }
  }

  // 특정 상태가 변했을때 이벤트를 통보할 함수를 작성합니다.
  notify: function (evnetName, data) {
    var handlerArray = this.handlers[eventName];
    if (undefined === handlerArray)
      return;

    for (var hidx = 0; hidx < handlerArray.length; hidx++) {
      var currentHandler = handlerArray[hidx];
      // call로 해당 context 주입 후 호출
      currentHandler['handler'].call(currentHandler['context'], data);
    }
  }
};

옵저버객체 활용
var boss = new Person();          // 여기에 사장이 있습니다.
var manager = new Person();       // 팀장도 있고,
var programmer = new Person();    // 개발자도 있습니다.

boss.speak = function(comment) { 
  // event notify
  observer.notify("bossSpeak", comment); 
};

manager.listen = function (comment) {
  this.bossComment = comment;
};
// 옵저버에 등록
observer.register("bossSpeak", manager.listen, manager);

programmer.drop = function (comment) { 
  return comment;
};
observer.register("bossSpeak", programmer.drop, programmer);

// 이벤트 실행
boss.speak("... for an hour ...");

:::tip 참고
http://blog.naver.com/PostView.nhn?blogId=c_ist82&logNo=220795909036
https://m.blog.naver.com/PostView.nhn?blogId=c_ist82&logNo=220795909036&proxyReferer=https%3A%2F%2Fwww.google.co.kr%2F
:::
Last Updated: 6/13/2019, 1:50:34 PM