Observer Pattern
- 객체의 상태가 바뀌면 그 객체에 의존하는 다른 객체에게 연락이 가고 자동으로 내용이 갱신 되는 방식.
- 일대다 (one-to-many) 의존성을 정의.
- push방식 과 pull 방식.
- ≒ 출판-구독 (publish-subscribe) 패턴.
구조
- Subject 객체와 Observer 객체가 존재
- Subject 객체는 Observer객체에게 상태 변경을 알려야 하기 때문에 Observer Collection field와 observer의 구독과 해지, 객체의 상태가 변경 되었을 때 알려주는 메소드가 존재.
- Observer 객체는 각자 Subject객체의 상태를 받아 처리 하는 부분을 구현.

장점
- 느슨한 결합 (Loose Coupling)
- 주제(Subject)와 옵저버(Observer) 사이의 관계를 느슨하게 만들어 준다.
- 주제는 옵저버가 구체적으로 어떻게 동작하는지 알 필요가 없으며, 옵저버는 주제의 구현 세부 사항을 모르고도 주제에 연결 가능.
- 확장성과 유연성
- 새로운 옵저버를 추가하거나 기존 옵저버를 제거하는 것이 비교적 간단하여 시스템에 새로운 기능을 도입할 때 코드 변경 최소화
- 분산 이벤트 처리
- 여러 객체 간에 상태 변경을 효과적으로 처리할 수 있어서, 분산 시스템에서 이벤트를 통지하고 처리하는 데 유용
단점
- 너무 많은 업데이트
- 옵저버의 수가 많아질수록 모든 옵저버에게 상태 변경을 통지하는 데 소요되는 비용이 증가. 이로 인해 불필요한 업데이트가 발생.
- 순서 보장이 안됨.
- 옵저버가 여러 개 있을 때, 어떤 옵저버가 먼저 업데이트되어야 하는지 정의하기 어려울 수 있다. 이로 인해 예측할 수 없는 동작이 발생 가능.
- 메모리 누수 가능성
- 주제가 옵저버에 대한 참조를 명시적으로 해제하지 않는다면, 메모리 누수가 발생가능
- 옵저버가 주제에 대한 참조를 유지하면서 주제가 더 이상 필요하지 않은데도 계속해서 참조하고 있을 수 있음.
용례
- MVC에서 모델과 뷰 사이를 느슨히 연결하기 위해 사용
- Java Swing 등
참조
https://en.wikipedia.org/wiki/Observer_pattern
'지식 > 디자인패턴' 카테고리의 다른 글
| Head First Design Patterns : Singleton Pattern (1) | 2024.01.01 |
|---|---|
| Head First Design Patterns : Factory Pattern (0) | 2023.12.31 |
| Head First Design Patterns : Decorator Pattern (1) | 2023.12.20 |
| Publish-Subscribe Pattern (0) | 2023.12.11 |
| Head First Design Patterns : Strategy Pattern (0) | 2023.11.29 |