본문 바로가기
컴퓨터 사이언스(CS)/기타 CS

[CS] 디자인 패턴 (옵저버 패턴)

by char_lie 2024. 7. 25.
반응형

 

옵저버 패턴( Observer Pattern)

 

출처 : https://aaronryu.github.io/2019/02/27/observer-pattern/

📝 옵저버 패턴이란?

  • 관찰자가 관찰하고 있는 대상자의 상태가 변화할 때마다 조치를 취하는 패턴
  • 일대다(one to many) 의존성을 가짐
  • 발행-구독(pub-sub) 모델로도 알려져 있음
  • 주로 MVC 패턴에서 사용됨

옵저버 패턴의 구성 요소

  • 주체 혹은 관찰 대상
    • 상태를 가지며, 옵저버를 등록하고 제거하는 메서드 제공
    • 상태가 변경되면 모든 등록된 옵저버에 전달
  • 옵저버(Observer)
    • 주제의 상태 변경을 통보받기 위해 등록된 객체
    • 주제의 상태 변경시 이를 통보 받아 자신의 상태를 업데이트

옵저버 패턴의 흐름

  • 한개의 관찰 대상자와 여러개의 관찰자로 일 대 다 구성
  • 관찰 대상의 상태가 바뀌면 변경사항을 옵저버에 통보
  • 통보 받은 옵저버는 값을 바꾸거나 삭제하는 등 대응
  • 옵저버는 언제든 대상자의 그룹에서 추가/삭제될 수 있음

옵저버 패턴의 특징

장점

  • 관찰 대상의 상태 변경을 주기적으로 조회하지 않고 자동으로 감지 가능
  • 발행자의 코드를 변경하지 않고도 새 구독자 ㅋ클래스를 도입할 수 있어 개방 폐쇄 원칙을 준수함
  • 런타임 시점에서 발행자와 구독 알림 관계
  • 상태를 변경하는 객체와 변경을 감지하는 객체의 관계를 느슨하게 유지할 수 있음(낮은 결합도)

단점

  • 구독자는 알림 순서를 제어할 수 없고, 무작위로 알림 받음
  • 옵저버 패턴을 자주 구성하면 구조와 동작을 알아보기 힘들어져 코드 복잡도 증가
  • 다수의 옵저버 객체를 등록 이후 해지하지 않으면 메모리 누수 발생 가능
반응형

옵저버 구현 예시(JavaScript)

class Subject {
    constructor() {
        this.observers = [];
    }

    addObserver(observer) {
        this.observers.push(observer);
    }

    removeObserver(observer) {
        this.observers = this.observers.filter(obs => obs !== observer);
    }

    notifyObservers() {
        this.observers.forEach(observer => observer.update());
    }
}
반응형

댓글