본문 바로가기

💻 개발IT/Design Patterns

3. Behavior 패턴 - Observer Pattern

문제 정의

weather station에 다양한 센서가 부착되어있는데,

weatherData Object는 weather station에 데이터를 받아 다양한 display 장치에 데이터를 전달해주는 역할을 하고 있다.

display 장치는 current conditions display, statistics display, forecast display가 존재한다.

 

weatherData에는 센서 값이 변경될 때마다 measurementChanged() 함수가 호출된다.

measurementsChanged() 함수에는 세 가지 display 장치를 update 해주는 코드가 작성되어있다. (종속성)

 

새로운 display 장치가 늘어날 수 있어 확장 가능한 SW를 만들어야한다!

 

 

Observer Pattern

Subject Object와 Observer에 one-to-many dependency를 가지고 있고  변화할 때마다 Observer에게 Nofity해주는 구조

 

 

메커니즘

1. Observer로 등록되어있지 않은 Duck Object가 Subject Object한테 등록 요청을 한다.

2. Duck Object가 Observers에 추가된다.

3. Subject Object 데이터가 변경되어 Notify할 때 Duck 도 함께 Notify받는다.

4. 만약, Mouse Object가 더이상 Notify 받는 걸 원치 않으면 Subject Object에 제거 요청을 한다.

5. 제외되며, 더 이상 변경에 대한 Notify를 받지 않는다. 

 

해결 방법

 

 

Java의 Observable Class 재사용

Subject class를 Java built-in Observable Class(이미 내부 로직 구현되어있음)로 대체한다.

Observer 등록, 해지 등이 이미 구현되어있어(재사용) 코드량이 감소된다.

이전과 달리, Data가 arg에 담겨오지 않고 weatherData에 직접 접근한다.

 

 

※ 사용시 주의할 점

 

1. Observable side : Notification 보내기 전, 우선 SetChanged() 호출(changed를 true로 변경하는 작업)하고 notifyObservers() 또는 notifyObservers(Object arg) 호출하면 된다.

 

2. Observer side

  • java.util.Observer interface해야 한다.
  • 등록하려면, addObserver()
  • 해지하려면, deleteObserver()
  • 업데이트 하려면, update(Observable o, Object arg)

 

 

 

 

반응형