33
. Design Patterns Study

Observer pattern dragor

Embed Size (px)

Citation preview

Page 1: Observer pattern dragor

제二.

옵저버

패턴

Design Patterns Study

Page 2: Observer pattern dragor

본 PPT는 Design Patterns Study를위해작성되었습니다.

Study에사용한교재는한빛미디어에서나온[Head First Desgin Patterns]을사용하였습니다.

Written by 서울시립대이희태 For study with NHN NEXT2기 조현호서울시립대 이희태

Page 3: Observer pattern dragor

옵저버패턴??

게임스타크래프트프로토스의유닛옵저버를기억하는가?

이유닛은정작본인은보이지않으면서 적진영을훤히꾀

뚫어보는말그대로 “관측”에타고난 유닛이다.

옵저버패턴역시 “관측”하는 Observer들과관측할대상

인 Subject로구성된패턴이다.

이패턴을공부하면서일대다관계와느슨한결합도알아보

자.

Page 4: Observer pattern dragor

업무계약체결서저희회사의차세대인터넷기반기상정보스테이션구축프로

젝트업체로선정된것을축하합니다!기상정보스테이션은저희회사에서현재특허출원중인

WeatherData객체를바탕으로만들어질것입니다. 이객체는현재의기상조건(기온, 습도, 기압)을추적하는객체입니다.기본적으로세개의항목을화면에표시하는애플리케이션을만들어주시길바랍니다. 세개의항목은각각현재조건, 기상통계, 그리고간단한기상예보이며, 이세항목모두WeatherData객체에서최신측정치를수집할때마다실시간으로갱신됩니다.(… …)

여러분이개발한디자인과알파버전을기다리겠습니다.- From 조니허리케인, CEO of Weather-O-Rama

Page 5: Observer pattern dragor

온도

습도

기압

기상스테이션

WeatherData객체

1) 기상통계 2) 기상예보 3) 현재조건

기상조건이변하면?

즉각반영하여

데이터취득

화면에표시

Page 6: Observer pattern dragor

코드를옵저버패턴쓰지않고만든경우

Interface가아닌구체적인구현으로코드를짰다.

3개의 display모두공통된인자를받아들이면서 update()를사용하기에추상화를하는것이낫다.

Display마다 달라지는 update()항목은따로빼서캡슐화하는것이좋다.

Page 7: Observer pattern dragor

그렇다면옵저버패턴이란무엇인가?

Subject

obj

2

obj

1

obj

3

obj

4

Observer Pattern : 한객체(subject)의상태가바뀌면그객체에의존하는다른객체들(observers)한테연락이가고자동으로내용이갱신되는방식의일대다의존성관계이다.

1 : 多관계

Page 8: Observer pattern dragor

옵저버패턴 ≒신문 구독신청

1대多관계에서의등록!, 해지! 그리고알림!

Page 9: Observer pattern dragor

구독신청할텐가?

John(28)

일단이것저것구독신청한후안읽는스타일

Bob(34)

구독료에민감하게반응하는스타일

Maggie(29)

한번구독하면잘끊지못하는스타일

Page 10: Observer pattern dragor

여기두신문사와세 명의잠재고객이 있다.

John(28) Bob(34) Maggie(29)

Fire DailyEXTRA NEWS

Page 11: Observer pattern dragor

John

Fire Daily

EXTRA NEWS

저는 John인데요. Fire Daily 6

개월간구독하려구요.

Bob

Maggie

좀지켜봐야겠다.

저도 Fire

Daily 6개월구독신청이요.

신청자이름은 Bob이에요.

Fire Daily 등록

Fire Daily 특별이벤트입니다.

지금등록하시면 6개월간$35라는저렴한가격으로구독하실수있습니다.

빠르고정확한 Extra

News,

1달에 $7!

Page 12: Observer pattern dragor

John

Fire Daily

EXTRA NEWS

구독자 John인데요. 6개월더연장구독할게

요.

Bob

Maggie

가격이올랐네요. Fire

Daily 구독해지하겠습니다.

빠르고정확한 Extra

News,

1달에 $7!

6개월후 -이벤트종료 -

엄선된토픽을선별하는 Fire

Daily! 1달에 $8!구독자에게알림

구독해지

Maggie라는사람인데요.

Extra News 6개월

구독요…

Extra News등록

Page 13: Observer pattern dragor

OBSERVER PATTERN UML

Page 14: Observer pattern dragor

디자인원칙 2. 느슨한결합 LOOSE COUPLING

1. Subject가 Observer객체에대해서아는것은오직 observer가특정Interface를구현한다는것뿐이다.

2. Observer객체의추가/제거는언제든지할수있다.

3. 새로운형식의 Observer를추가하려고한다해도 Subject를전혀변경할필요가없다.

4. Subject와 Observer는서로독립적으로재사용할수있다.

서로상호작용하는객체사이에서는가능하면느슨하게결합(하는디자인을사용해야한다.

Page 15: Observer pattern dragor

기상스테이션 설계

interface

Concrete class

registerObserver()

removeObserver()

notifyObservers()

Subject

update()

Observer

display()

DisplayElement

update()

display()

CurrentConditions

registerObserver()

removeObserver()

notifyObservers()

getTemperature()

getHumidity()

getPressure()measurementsChanged()

WeatherData

update()

display()

ForecastDisplay

update()

display()

StatisticsDisplay

Page 16: Observer pattern dragor

기상스테이션구현 (1) Subject, Observer,

DisplayElement interface

Page 17: Observer pattern dragor

기상스테이션구현 (2) weatherData객체

Page 18: Observer pattern dragor

weatherData객체 이어서…

Page 19: Observer pattern dragor

기상스테이션구현 (3) -①Display 객체구현 –

CurrentConditions

Page 20: Observer pattern dragor

기상스테이션구현 (3) -② StatisticsDisplay

Page 21: Observer pattern dragor

기상스테이션구현 (3) -③ ForecastDisplay

Page 22: Observer pattern dragor

기상스테이션구현마지막

Page 23: Observer pattern dragor

CONSOLE 출력결과

Page 24: Observer pattern dragor

자바내장옵저버패턴Java.util.Observable, java.util.Observer

addObserver()

deleteObserver()

notifyObservers()

setChanged()

java.util.Observable

update()

java.util.Observer

display()

DisplayElement

update()

display()

CurrentConditions

addObserer()

deleteObserver()

notifyObservers()

setChanged()

getTemperature()

getHumidity()

getPressure()

WeatherData

update()

display()

ForecastDisplay

update()

display()

StatisticsDisplay

Page 25: Observer pattern dragor

SUBJECT ,

OBSERVABLE 비교

addObserver()

deleteObserver()

notifyObservers()

setChanged()

java.util.Observable

registerObserver()

removeObserver()

notifyObservers()

Subject

• Java.util.Observable은인터페이스가아니라클래스이다.

• registerObserver() == addObserver(), removeObserver() ==

deleteObserver(), notifyObservers() == notifyObservers()

• java.util.Observable에서는구현의도에따라서notifyObservers() 또는 notifyObservers(Object arg) 두가지방식으로사용한다.

• setChanged()는 notifyObservers()를위해사용됨

Page 26: Observer pattern dragor

public void notifyObservers(Object arg) :

hasChanged()가실행되어이객체가변하면,

객체에등록된모든 observer들에게바뀐정보를알려준후clearChanged()가실행되어더이상의변화가없도록한다.

각각의 observer들은두개의매개변수를받는 update(observable

o, object arg) 메소드를구현해야한다.

notifyObservers() 메소드

Page 27: Observer pattern dragor

알리는방식은 PUSH방식과 PULL방식이 있다

Subject

(=Obser

vable)

obser

ver

obser

ver

obser

ver

PUSH!notifyObservers(Object arg)

Subject가변하면자동으로모든 observer들에게 push!

Subject

(=Obser

vable)

obser

ver

obser

ver

obser

ver

PULL~notifyObservers()

Subject가변하면observer들이알아서원하는데이터를당겨옴(pull!)

Page 28: Observer pattern dragor

옵저버가연락 받는 방법

PUS

H

PULL

Push방법:

Observable객체가

notify(Object arg) 를사용하면,

Observer쪽에서는 update(Observable o,

object arg)에서 arg를그대로받는다.

Pull방법:

Observable객체는 notify()를사용.

Observer쪽에서는 update(Observable o,

object arg)에서 arg는 null이된다.

☞ notify() == notify(null)

* notifyObservers()를 편의상 notify()로표현

Page 29: Observer pattern dragor

PULL 방식으로구현Java.util.Observable, java.util.Observer을통한

Page 30: Observer pattern dragor

CurrentConditonDisplay.java

Page 31: Observer pattern dragor

CONSOLE 출력결과 (PULL)

이전의출력과비교했을때순서가바뀌었다?

사실순서라는것이의미가없다.옵저버한테연락이가는순서에의존하면절대안된다.

Page 32: Observer pattern dragor

요 약 정 리

• 옵저버패턴에서는관찰대상인 Subject(Observable)

와관찰하는 Observer와의 1대多관계를정의한다.

• Observable객체와 Observer객체사이의결합은느슨한결합이다.

• 옵저버패턴을이용하면 Observable객체에서데이터를보내거나(push), Observer가데이터를가져오는(pull) 방식을쓸수있다.

• 스윙및여러 gui프레임워크에서도옵저버패턴이많이응용된다.

Page 33: Observer pattern dragor