[Java] 디자인 패턴 (2) - 옵저버 패턴
옵저버 패턴이란
옵저버는 관찰자라는 말이다.
옵저버가 관찰하고 있는 대상의 상태가 변하면,
관찰 대상(=발행자)는 자신을 관찰하고 있는 옵저버들에게 메시지를 전달하고
옵저버들은 그 메시지를 받아 조치를 취하는 행위 패턴이다.
유튜브로 예시로 들면 이해하기 편하다.
- 구독자 == 옵저버 == 관찰자
- 유튜버 == 발행자 == 관찰 대상
- '관찰하다' == '구독한다'
구독자들이 유튜버를 구독하면, 유튜버가 동영상을 업로드할 시에 알림을 받을 수 있듯
옵저버가 주체자를 관찰하도록 하고 주체자의 상태가 변하면 옵저버는 관련 메시지를 받을 수 있다.
- IPublisher: 관찰 대상 (주체자) 인터페이스
- Publisher: 관찰 대상 클래스
- ISubscriber: 관찰자 인터페이스
- Subscriber: 관찰자 클래스
다른 디자인 패턴들과 마찬가지로 상호작용할 객체를 합성하는 형태이다.
예시
1. IPublisher, Publisher
발행자 인터페이스, 발행자 클래스
- List로 구독자들을 저장한다
- remove: 구독자를 삭제하여 더이상 메시지를 받지 못하게 한다.
- register: 구독자를 저장한다. 여기서 등록된 구독자들을 메시지를 받을 수 있다.
- upload, announce: 발행자가 업로드하거나 공지를 하면 구독자들에게 관련 메시지를 보낸다.
2. ISubscriber, Subscriber
구독자 인터페이스, 구독자 클래스
- updateFeed, updateNotice: 발행자의 upload(), announce() 메서드에서 호출되는 메서드로, 발행자로부터 메시지를 받아 처리함
실행결과
장점
- 구독자들은 발행자의 상태를 주기적으로 확인하지 않고, 상태가 변경된다면 편하게 알림받을 수 있다.
유튜브로 예를 들자면 내가 좋아하는 유튜브의 피드를 계속 확인하면서 업로드된 영상이 있나 확인하지 않고도, 유튜버가 동영상을 업로드 하면 알림으로 그 내용을 확인할 수 있다.
- 발행자와 구독자는 서로 인터페이스, 추상클래스를 의존하고 있기 때문에 OCP를 지킬 수 있다.
다른 형태의 구독자가 생겨도 발행자 코드는 변경하지 않아도 된다.