본문 바로가기
카테고리 없음

[디자인패턴] 옵저버 패턴(Observer Pattern) 개념과 구성요소 알아보기

by Warehaus 2022. 8. 15.

 

개념

일대 다의 객체 관계에서 한 객체의 상태가 변하면 다른 모든 객체에 그 사항을 알리고, 필요한 수정을 자동으로 수행하기 위한 모델. Publish / Subscribe 모델로도 알려져 있다.

 

목적

시스템 내에서 객체의 상태 변화를 하나 또는 여러 객체에게 알림

 

Use when

- 객체 간 communication 을 위해 Loose coupling이 필요한 경우

- 하나 또는 다중 객체에서의 상태 변화에 따라 다른 객체의 행위를 수행하는 경우

- 객체는 다른 객체에 변화를 통보할 수 있고, 변화에 관심이 있는 객체들이 누군지 몰라도 수행 가능해야 하는 경우

- Broadcasting 이 필요한 경우

 

Diagram 및 구성요소

 

출처: 위키피디아

 

 

- Subject : 관찰자들을 가지고 있으며 (Aggregation), 다수의 Observer 객체는 대상을 관찰합니다. Observer 객체를 대상과 연결하거나 연결을 해제하기 위한 인터페이스를 갖습니다.  

 

- Observer: 대상에 생긴 변화에 관심있는 객체를 변경하는데 필요한 인터페이스를 갖습니다. 이로써 Subject의 변경에 따라 변화되어야 하는 객체들의 일관성을 유지합니다.

 

- ConcreteSubject: ConcreteObserver 객체에 알려줘야 하는 상태를 저장합니다. 또한, 이 상태가 변경될 때 관찰자에게 변경을 통보합니다.

위 그림에는 별도의 ConcreteSubject를 표현하지 않았으나 Subject 를 interface 로 만들어 옵저버 등록/삭제 메서드를 추상 메서드로 구현한 뒤, 이를 구현해 주는 ConcreteSubject class를 만드는 구조로 작성하는 경우도 있어 추가 설명을 더합니다. 

ConcreteObserver를 구현하는 경우 실제 업데이트에 대한 구현은 ConcreteSubject에서 일어나게 됩니다.

 

- ConcreteObserver: ConcreteSubject 객체에 대한 참조자를 관리합니다. 대상과 일관성을 유지해야 하는 상태를 저장하고 있습니다. 대상과 일관성 유지를 위해 관찰자를 수정해야 하므로 이에 필요한 인터페이스를 구현합니다.