옵저버 패턴
- 다수의 객체가 특정 객체 상태 변화를 감지하고 알림을 받는 패턴
- 이 패턴을 사용하면 발행(publish) - 구독(subcribe)패턴을 쉽게 구현할 수 있다.
(pub - sub 패턴)
※ subject는 여러 옵저버들을 등록하거나 해지할 수 있는 기능을 제공
옵저버 패턴 사용 이유
user1은 메시지를 보내지만 그 메시지는 user2가 "디자인 패턴"을 조회하기 전까지는
user2에게 전달되지 않고, 받고 싶다면 user2가 직접 호출을 해야하는 문제점이 있음
Subscriber
User
- ConcreteObserver에 해당
- 간단하게 들어온 메시지를 출력하는 역할만 함
- subscriber를 구현하는 구현체
ChatServer
- 여러 옵저버들을 등록하거나 해지할 수 있는 역할
- 주제별로 옵저버들을 묶어둘 것이기 때문에 Map 사용(subscriber들의 목록을 관리)
- Subject에 해당
Client
- 클라이언트는 ChatServer의 sendMessage 메소드를 호출하여 subject가 일치하는 메시지만 보낸다.
옵저버 패턴의 장/단점
장점
- 상태를 변경하는 객체(publisher)와 변경을 감지하는 객체(subscriber)의 관계를 느슨하게 유지할 수 있다.(코드 작성이 쉽고, 변경이 쉽고, 테스트 하기도 쉽고, 재사용하기도 쉽다)
- Subject의 상태 변경을 주기적으로 조회하지 않고 자동으로 감지할 수 있다.
- 런타임에 옵저버를 추가하거나 제거할 수 있다.
단점
- 복잡도가 증가한다.
- 다수의 Observer 객체를 등록 이후 해지 않는다면 Memory leak이 발생할 수도 있다.