Observer Pattern
옵저버 패턴이란?
옵저버 패턴(observer Pattern)은 옵저버(관찰자)들이 관찰하고 있는 대상이 상태가 변화가 있을 때마다 대상자는 직접 목록의 간 관찰자들에게 통지하고, 관찰자들은 알림을 받아 조치를 취하는 행동패턴이다.
옵저버 패턴은 여타 다른 디자인 패턴과 다르게 일대다(one-to-many)의존성을 가지는데, 주로 분산 이벤트 핸들링 시스템을 구현하는 데 사용된다. Pub/Sub(발행/구독)모델로도 알려져 있기도 하다.
이 패턴을 이해하는데 있어 플렛폼의 구독시스템을 비교하면 된다. 플렛폼에서 새로운 컨텐츠가 올리면 구독자가 알림을 받느 형태이다. 이처럼 옵저버 패턴은 시청자(관찰자)가 필요한 정보에 구독하여 알림을 받는 형태이다.
- 옵저버 패턴에서는 한개의 관찰 대상자와 여러개의 관찰자로 일 대 다 관계로 구성되어 있다.
- Observer패턴에서는 관찰 대상의 상태가 바뀌면 변경사항을 옵저버 한태 통보해준다.
- 받은 정보를 활용하여 값을 추가, 수정, 삭제등의 적절한 행동을 수행한다(Update)
- 또한 Observer들은 언제든 관찰대상을 그룹에서 추가/ 삭제 될 수 있다. 그룹에 추가되면 관찰대상으로 부터 정보를 전달받게 될 것이며, 그룹에서 삭제될 경우 더 이상 정보를 받을 수 없게된다.
특징
패턴 사용 시기
- 앱이 한정된 시간, 특정한 케이스에만 다른 객체를 관찰해야 하는 경우
- 대상 객체의 상태가 변경될 때마다 다른 객체의 동작을 트리거해야 할때
- 한 객체의 상태가 변경되면 다른 객체도 변경해야 할때, 그런데 어떤 객체들이 변경되어야 하는지 몰라도 될 때
- MVC 패턴에서도 사용됨(Model, View, Controller)
장점
- 상태 변화를 주기적으로 조회하지 않고 자동으로 감지가 가능하다.
- 발행자의 코드를 변경하지 않고도 새 구독자 클래스를 도입할 수 있어 개방 페쇄 원칙(OCP) 준수한다.
- 상태를 변경하는 객체와 변경을 감지하는 객체의 관계를 느슨하게 유지할 수 있다.
단점
- 구족자는 알림 순서를 제어할 수 없고, 무작위 순서로 알림을 받습니다.
- 옵저버 패턴을 자주 구성하면 구조와 동작을 알아보기 힘들어져 코드 복잡도가 증가한다.
- 다수 옵저버 객체를 등록 이후 해지하지 않는다면 메모리 누수가 발생할 수도 있다.