옵서버 패턴

IT 위키
(Observer에서 넘어옴)

Observer Pattern

한 객체의 상태가 바뀌면 그 객체에 의존하는 다른 객체들에게 자동으로 통보되도록 하는 GoF 행위 패턴

일대다 의존 관계를 정의하되, 주체(Subject)와 관찰자(Observer)가 서로를 구체적으로 알지 않아도 되도록 느슨하게 결합시킨다. 발행-구독(Publish-Subscribe) 구조의 기본형이다.

구성 요소

[편집 | 원본 편집]
역할 설명
Subject 관찰 대상. 옵서버 목록을 관리하고 등록·해제 메서드를 제공한다
Observer 통보를 받는 인터페이스. update() 를 정의한다
ConcreteSubject 실제 상태를 가지며, 상태가 바뀌면 notify() 로 옵서버들에게 알린다
ConcreteObserver 통보를 받아 자신의 상태를 갱신한다
  1. 옵서버가 Subject 에 자신을 등록한다.
  2. Subject 의 상태가 변한다.
  3. Subject 가 등록된 모든 옵서버의 update() 를 호출한다.
  4. 각 옵서버가 필요한 처리를 수행한다.

파이썬 코드 예제

[편집 | 원본 편집]
  class Subject:
      def __init__(self):
          self.observers = []
      def attach(self, observer):
          self.observers.append(observer)
      def notify(self, value):
          for o in self.observers:
              o.update(value)

  class Display:
      def __init__(self, name):
          self.name = name
      def update(self, value):
          print(self.name, "received", value)

  subject = Subject()
  subject.attach(Display("A"))
  subject.attach(Display("B"))
  subject.notify(25)
  • GUI 의 이벤트 리스너
  • 데이터 변경에 따른 화면 자동 갱신 (MVC 의 모델-뷰 관계)
  • 메시지 브로커의 구독 구조

옵서버가 많아지면 통보 비용이 커지고, 갱신 순서를 보장하지 않는다는 점에 유의한다.

같이 보기

[편집 | 원본 편집]