본문 바로가기
지식/디자인패턴

Head First Design Patterns : Observer Pattern

by CodeRain 2023. 12. 10.

Observer Pattern

  • 객체의 상태가 바뀌면 그 객체에 의존하는 다른 객체에게 연락이 가고 자동으로 내용이 갱신 되는 방식.
  • 일대다 (one-to-many) 의존성을 정의.
  • push방식 과 pull 방식.
  • 출판-구독 (publish-subscribe) 패턴.

 

구조

  • Subject 객체와 Observer 객체가 존재
  • Subject 객체는 Observer객체에게 상태 변경을 알려야 하기 때문에 Observer Collection field와 observer의 구독과 해지, 객체의 상태가 변경 되었을 때 알려주는 메소드가 존재.
  • Observer 객체는 각자 Subject객체의 상태를 받아 처리 하는 부분을 구현.

Observer pattern UML diagram

 

 

장점

  1. 느슨한 결합 (Loose Coupling)
    • 주제(Subject)와 옵저버(Observer) 사이의 관계를 느슨하게 만들어 준다.
    • 주제는 옵저버가 구체적으로 어떻게 동작하는지 알 필요가 없으며, 옵저버는 주제의 구현 세부 사항을 모르고도 주제에 연결 가능.
  2. 확장성과 유연성
    • 새로운 옵저버를 추가하거나 기존 옵저버를 제거하는 것이 비교적 간단하여 시스템에 새로운 기능을 도입할 때 코드 변경 최소화
  3. 분산 이벤트 처리
    • 여러 객체 간에 상태 변경을 효과적으로 처리할 수 있어서, 분산 시스템에서 이벤트를 통지하고 처리하는 데 유용

 

단점

  1. 너무 많은 업데이트
    • 옵저버의 수가 많아질수록 모든 옵저버에게 상태 변경을 통지하는 데 소요되는 비용이 증가. 이로 인해 불필요한 업데이트가 발생.
  2. 순서 보장이 안됨.
    • 옵저버가 여러 개 있을 때, 어떤 옵저버가 먼저 업데이트되어야 하는지 정의하기 어려울 수 있다. 이로 인해 예측할 수 없는 동작이 발생 가능.
  3. 메모리 누수 가능성
    • 주제가 옵저버에 대한 참조를 명시적으로 해제하지 않는다면, 메모리 누수가 발생가능
    • 옵저버가 주제에 대한 참조를 유지하면서 주제가 더 이상 필요하지 않은데도 계속해서 참조하고 있을 수 있음.

 

용례

  • MVC에서 모델과 뷰 사이를 느슨히 연결하기 위해 사용
  • Java Swing 등

 

 

참조

https://en.wikipedia.org/wiki/Observer_pattern