카테고리 없음

[Java] 디자인 패턴 (2) - 옵저버 패턴

23 2024. 2. 19. 20:06

옵저버 패턴이란

옵저버는 관찰자라는 말이다.

 옵저버가 관찰하고 있는 대상의 상태가 변하면,

관찰 대상(=발행자)는 자신을 관찰하고 있는 옵저버들에게 메시지를 전달하고

옵저버들은 그 메시지를 받아 조치를 취하는 행위 패턴이다. 

 

유튜브로 예시로 들면 이해하기 편하다.

  - 구독자 == 옵저버 == 관찰자

  - 유튜버 == 발행자 == 관찰 대상

  - '관찰하다' == '구독한다'

구독자들이 유튜버를 구독하면, 유튜버가 동영상을 업로드할 시에 알림을 받을 수 있듯

옵저버가 주체자를 관찰하도록 하고 주체자의 상태가 변하면 옵저버는 관련 메시지를 받을 수 있다.

 

옵저버 패턴

- IPublisher: 관찰 대상 (주체자) 인터페이스

- Publisher: 관찰 대상 클래스

 

- ISubscriber: 관찰자 인터페이스

- Subscriber: 관찰자 클래스

 

다른 디자인 패턴들과 마찬가지로 상호작용할 객체를 합성하는 형태이다.

 


예시

 

1. IPublisher, Publisher

발행자 인터페이스, 발행자 클래스

 

 

 

- List로 구독자들을 저장한다

- remove: 구독자를 삭제하여 더이상 메시지를 받지 못하게 한다.

- register: 구독자를 저장한다. 여기서 등록된 구독자들을 메시지를 받을 수 있다.

- upload, announce: 발행자가 업로드하거나 공지를 하면 구독자들에게 관련 메시지를 보낸다.

 

2. ISubscriber, Subscriber

구독자 인터페이스, 구독자 클래스

 

 

 

- updateFeed, updateNotice: 발행자의 upload(), announce() 메서드에서 호출되는 메서드로, 발행자로부터 메시지를 받아 처리함

 

 

 

실행결과

 

 


장점

- 구독자들은 발행자의 상태를 주기적으로 확인하지 않고, 상태가 변경된다면 편하게 알림받을 수 있다.

   유튜브로 예를 들자면 내가 좋아하는 유튜브의 피드를 계속 확인하면서 업로드된 영상이 있나 확인하지 않고도, 유튜버가 동영상을 업로드 하면 알림으로 그 내용을 확인할 수 있다.

 

- 발행자와 구독자는 서로 인터페이스, 추상클래스를 의존하고 있기 때문에 OCP를 지킬 수 있다.

   다른 형태의 구독자가 생겨도 발행자 코드는 변경하지 않아도 된다.