한 객체의 상태가 바뀌면 그 객체에 의존하는 다른 객체에 연락이 가고자동으로 내용이 갱신되는 방식입니다.
주체 데이터가 바뀌면 모든 구독자에게 바뀌었다는 소식을 전달합니다.
장점
- 데이터를 주기적으로 갱신하지 않아도 Observer(구독자)로 등록하게 되면 최신 데이터로 받아옵니다.
2. Observer(구독자)로 등록 또는 해제가 가능합니다. (상호의존성 최소화)
3. Observer(구독자) 서로 간에는 모릅니다. (느슨한 결합)
단점
- Observer가 너무 많아질 경우 관리가 힘들어 질 수 있다.
- 큐 형태로 데이터 배분 처리가 되어 데이터 배분에 문제가 생기면 자칫 큰문제로 이어질 수 있다.
- 갑작스레 데이터가 변경이 될 경우에 원하는 결과값을 얻기 힘들 수 있다. (Thread-unsafe)
- Observer를 제때 제거하지 않으면 메모리 누수가 일어난다.
- 비동기 방식으로 원하는 순서대로 받지 못할 수 있다.
<예시>
주체 역할 클래스 — MessageSender
옵저버 인터페이스 — MessageObserver
옵저버 역할 1,2,3 — User1, User2, User3
실행 클래스
실행결과에서 선 ‘— — — — — — —’ 을 기준으로 구분지어 설명 드리면,
- User1, User2, User3 을 옵저버로 등록 후에 메세지 전달하니 모두 다 주체로부터 메세지 ‘Hello Everyone!!’을 전달받았습니다.
- User1을 옵저버에서 제거 후에 메세지를 전달하니 User1을 제외한 User2, User3가 주체로부터 메세지 ‘Big News!!’을 전달받았습니다.