sharingStorage

Observer Pattern 본문

디자인패턴

Observer Pattern

Anstrengung 2021. 12. 29. 12:19

Observer Pattern(관찰자 패턴)

한 객체의 상태 변화에 따라 다른 객체의 상태도 연동되도록 일대다 객체 의존 관계를 구성 하는 패턴

 

옵저버 패턴은 어떤 데이터의변화를 감지하여 전달하는 객체가 있고 데이터가 변할 때마다 데이터를 받는 객체가 있습니다. 흔히 변화를감지하여 전달하는 객체를 Observerable 객체(publisher)라 하고, 변화된 데이터를 받는 객체를 Observer 객체(subscribe)라 합니다

 

유용성

데이터의 변경이 발생했을 경우 상대 클래스나 객체에 의존하지 않으면서 데이터 변경을 통보하고자 할 때 유용하다.
주제 역할을 하는 클래스, 옵저버 역할을 하는 클래스는 각각 Subject, Observer 인터페이스를 구현하기만 하면 되므로 옵저버의 구상 클래스가 무엇인지, 옵저버가 무엇을 하는지 등에 대해서 알 필요가 없다.

각 클래스가 서로에 대해 잘 모르기 때문에 주제와 옵저버는 서로 독립적이며 재사용가능하다.

 

 

구조 및 역할

 

 

Observer
데이터의 변경을 통보 받는 인터페이스
즉, Subject에서는 Observer 인터페이스의 update 메서드를 호출함으로써 ConcreteSubject의 데이터 변경을 ConcreteObserver에게 통보한다.


Subject (publisher)
ConcreteObserver 객체를 관리하는 요소 (Publisher)
Observer 인터페이스를 참조해서 ConcreteObserver를 관리하므로 ConcreteObserver의 변화에 독립적일 수 있다.


ConcreteSubject
변경 관리 대상이 되는 데이터가 있는 클래스(통보하는 클래스)
데이터 변경을 위한 메서드인 setState가 있다.
setState 메서드에서는 자신의 데이터인 subjectState를 변경하고 Subject의 notifyObservers 메서드를 호출해서 ConcreteObserver 객체에 변경을 통보한다.


ConcreteObserver
ConcreteSubject의 변경을 통보받는 클래스
Observer 인터페이스의 update 메서드를 구현함으로써 변경을 통보받는다.
변경된 데이터는 ConcreteSubject의 getState 메서드를 호출함으로써 변경을 조회한다.

 

옵저버 패턴에는 크게 두가지 역할이 있다.

하나는 Subject - 주체자(Publisher)의 역할, 또 하나는 Observer(subscribe - 관찰자)의 역할이다. 일단 이들의 인터페이스를 정의한 후 이를 implement한 클래스들을 이용한다.

 

Subject 라는 인터페이스는 Observer들을 관리하는 Method를 가지고 있다.

Observer 인터페이스는 정보를 업데이트 해주는 Update method를 가지고 있다.

 

 

 

두가지 방식

 Push: Publisher(Subject)에서 정보나 상태가 변경될 때마다 Observer에게 보내는(알려주는) 방식

 Pull: Observer에서 정보가 필요할 때마다 Publisher에게 요청하는 방식

 

 

 

추신: 

MVC 패턴을 사용하기 위한 기초 개념이기도 하며 Angular, Swing Android 등 UI관련된 곳에서 많이 사용된다.

RxJS의 기본 개념

 


출처: 

https://flowarc.tistory.com/entry/디자인-패턴-옵저버-패턴Observer-Pattern 

https://gmlwjd9405.github.io/2018/07/08/observer-pattern.html

https://luckygg.tistory.com/181   

https://haeng-on.tistory.com/m/97   


참고서적:

JAVA 객체지향 디자인 패턴:UML과 GoF 디자인 패턴 핵심 10가지로 배우는

'디자인패턴' 카테고리의 다른 글

Iterator Pattern  (0) 2021.12.29
Comments