일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 |
- 메모리 구조
- JDBC
- @SubscribeMapping
- API
- 리눅스
- JPA
- 쉘 스크립트
- application layer
- @Autowired
- spring
- 편향된 지수
- compgen
- intelij spring config
- BindingResult
- 런타임 상수
- 오블완
- 프로그래머스
- m:n
- DTO
- 컴파일 타임 상수
- 알고리즘
- mysql
- allocationSize
- Git
- 커밋 되돌리기
- 티스토리챌린지
- 파이썬
- 기본키 전략
- 쿠키
- 백준
- Today
- Total
둘셋 개발!
[Java] 디자인 패턴 (2) - 옵저버 패턴 본문
옵저버 패턴이란
옵저버는 관찰자라는 말이다.
옵저버가 관찰하고 있는 대상의 상태가 변하면,
관찰 대상(=발행자)는 자신을 관찰하고 있는 옵저버들에게 메시지를 전달하고
옵저버들은 그 메시지를 받아 조치를 취하는 행위 패턴이다.
유튜브로 예시로 들면 이해하기 편하다.
- 구독자 == 옵저버 == 관찰자
- 유튜버 == 발행자 == 관찰 대상
- '관찰하다' == '구독한다'
구독자들이 유튜버를 구독하면, 유튜버가 동영상을 업로드할 시에 알림을 받을 수 있듯
옵저버가 주체자를 관찰하도록 하고 주체자의 상태가 변하면 옵저버는 관련 메시지를 받을 수 있다.
- IPublisher: 관찰 대상 (주체자) 인터페이스
- Publisher: 관찰 대상 클래스
- ISubscriber: 관찰자 인터페이스
- Subscriber: 관찰자 클래스
다른 디자인 패턴들과 마찬가지로 상호작용할 객체를 합성하는 형태이다.
예시
1. IPublisher, Publisher
발행자 인터페이스, 발행자 클래스
- List로 구독자들을 저장한다
- remove: 구독자를 삭제하여 더이상 메시지를 받지 못하게 한다.
- register: 구독자를 저장한다. 여기서 등록된 구독자들을 메시지를 받을 수 있다.
- upload, announce: 발행자가 업로드하거나 공지를 하면 구독자들에게 관련 메시지를 보낸다.
2. ISubscriber, Subscriber
구독자 인터페이스, 구독자 클래스
- updateFeed, updateNotice: 발행자의 upload(), announce() 메서드에서 호출되는 메서드로, 발행자로부터 메시지를 받아 처리함
실행결과
장점
- 구독자들은 발행자의 상태를 주기적으로 확인하지 않고, 상태가 변경된다면 편하게 알림받을 수 있다.
유튜브로 예를 들자면 내가 좋아하는 유튜브의 피드를 계속 확인하면서 업로드된 영상이 있나 확인하지 않고도, 유튜버가 동영상을 업로드 하면 알림으로 그 내용을 확인할 수 있다.
- 발행자와 구독자는 서로 인터페이스, 추상클래스를 의존하고 있기 때문에 OCP를 지킬 수 있다.
다른 형태의 구독자가 생겨도 발행자 코드는 변경하지 않아도 된다.