SlideShare a Scribd company logo
1 of 33
제
二
.
옵
저
버
패
턴
Design Patterns Study
본 PPT는 Design Patterns Study를 위해 작성되었습니다.
Study에 사용한 교재는 한빛미디어에서 나온
[Head First Desgin Patterns]을 사용하였습니다.
Written by 서울시립대 이희태 For study with NHN NEXT2기 조현호
서 울 시 립 대 이 희 태
옵저버 패턴??
게임 스타크래프트 프로토스의 유닛 옵저버를 기억하는가?
이 유닛은 정작 본인은 보이지 않으면서 적 진영을 훤히 꾀
뚫어보는 말그대로 “관측”에 타고난 유닛이다.
옵저버 패턴 역시 “관측”하는 Observer들과 관측할 대상
인 Subject로 구성된 패턴이다.
이 패턴을 공부하면서 일대다 관계와 느슨한 결합도 알아보
자.
업무 계약 체결서
저희 회사의 차세대 인터넷 기반 기상 정보 스테이션 구축 프로
젝트 업체로 선정된 것을 축하합니다!
기상 정보 스테이션은 저희 회사에서 현재 특허 출원 중인
WeatherData객체를 바탕으로 만들어질 것입니다. 이 객체는 현
재의 기상조건(기온, 습도, 기압)을 추적하는 객체입니다.
기본적으로 세 개의 항목을 화면에 표시하는 애플리케이션을 만
들어주시길 바랍니다. 세 개의 항목은 각각 현재 조건, 기상 통계,
그리고 간단한 기상 예보이며, 이 세 항목 모두 WeatherData객체
에서 최신 측정치를 수집할 때마다 실시간으로 갱신됩니다.
(… …)
여러분이 개발한 디자인과 알파버전을 기다리겠습니다.
- From 조니 허리케인, CEO of Weather-O-Rama
온도
습도
기압
기상
스테이션
WeatherData 객체
1) 기상통계 2) 기상예보 3) 현재조건
기상 조건이 변하면?
즉각 반영하여
데이터 취득
화면에 표시
코드를 옵저버 패턴 쓰지 않고 만든 경우
Interface가 아닌 구체적인
구현으로 코드를 짰다.
3개의 display모두 공통된 인자를
받아들이면서 update()를 사용하기
에 추상화를 하는 것이 낫다.
Display마다 달라지는 update()항목은
따로 빼서 캡슐화하는 것이 좋다.
그렇다면 옵저버 패턴이란 무엇인가?
Subject
obj
2
obj
1
obj
3
obj
4
Observer Pattern : 한 객체(subject)의 상태가 바뀌면 그 객체에
의존하는 다른 객체들(observers)한테 연락이 가고 자동으로 내
용이 갱신되는 방식의 일대다 의존성 관계이다.
1 : 多 관계
옵저버 패턴 ≒ 신문 구독 신청
1대多관계에서의 등록!, 해지! 그
구독신청
할 텐가?
John(28)
일단 이것저
것 구독 신청
한 후 안 읽
는 스타일
Bob(34)
구독료에 민
감하게 반응
하는 스타일
Maggie(29)
한번 구독하면
잘 끊지 못하는
스타일
여기 두 신문사와 세 명의
잠재 고객이 있다.
John(28) Bob(34) Maggie(29)
Fire Daily
EXTRA NEWS
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!
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등록
OBSERVER PATTERN UML
디자인 원칙 2. 느슨한 결합 LOOSE COUPLING
1. Subject가 Observer객체에 대해서 아는 것은 오직 observer가 특정
Interface를 구현한다는 것 뿐이다.
2. Observer객체의 추가/제거는 언제든지 할 수 있다.
3. 새로운 형식의 Observer를 추가하려고 한다 해도 Subject를 전혀 변
경할 필요가 없다.
4. Subject와 Observer는 서로 독립적으로 재사용할 수 있다.
서로 상호작용하는 객체 사이에서는 가능하면 느슨하게
결합(하는 디자인을 사용해야 한다.
기상 스테이션 설계
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
기상 스테이션 구현 (1) Subject, Observer,
DisplayElement interface
기상 스테이션 구현 (2) weatherData객체
weatherData객체 이어서…
기상 스테이션 구현 (3) - ①
Display 객체 구현 –
CurrentConditions
기상 스테이션 구현 (3) - ② StatisticsDisplay
기상 스테이션 구현 (3) - ③ ForecastDisplay
기상 스테이션 구현 마지막
CONSOLE 출력 결과
자바 내장 옵저버 패턴
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
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()를 위해 사용됨
public void notifyObservers(Object arg) :
hasChanged()가 실행되어 이 객체가 변하면,
객체에 등록된 모든 observer들에게 바뀐 정보를 알려준 후
clearChanged()가 실행되어 더 이상의 변화가 없도록 한다.
각각의 observer들은 두 개의 매개변수를 받는 update(observable
o, object arg) 메소드를 구현해야한다.
notifyObservers() 메소드
알리는 방식은 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!)
옵저버가 연락 받는 방법
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()로 표현
PULL 방식으로 구현
Java.util.Observable, java.util.Observer을 통한
CurrentConditonDisplay.java
CONSOLE 출력 결과 (PULL)
이전의 출력과 비교했을
때 순서가 바뀌었다?
사실 순서라는 것이 의미가 없다.
옵저버한테 연락이 가는 순서에 의존하면 절대 안된다.
요 약 정 리
• 옵저버 패턴에서는 관찰대상인 Subject(Observable)
와 관찰하는 Observer와의 1대 多관계를 정의한다.
• Observable객체와 Observer객체 사이의 결합은 느
슨한 결합이다.
• 옵저버 패턴을 이용하면 Observable객체에서 데이터
를 보내거나(push), Observer가 데이터를 가져오는
(pull) 방식을 쓸 수 있다.
• 스윙 및 여러 gui프레임워크에서도 옵저버패턴이 많
이 응용된다.
Observer pattern dragor

More Related Content

Viewers also liked

Design patterns 스터디 - Singleton 패턴
Design patterns 스터디 - Singleton 패턴Design patterns 스터디 - Singleton 패턴
Design patterns 스터디 - Singleton 패턴Hyunho-Cho
 
Design Pattern 3
Design Pattern 3Design Pattern 3
Design Pattern 3Daniel Lim
 
Api design for c++ pattern
Api design for c++ patternApi design for c++ pattern
Api design for c++ patternjinho park
 
Design patterns 스터디 -strategy패턴
Design patterns 스터디 -strategy패턴Design patterns 스터디 -strategy패턴
Design patterns 스터디 -strategy패턴Hyunho-Cho
 
Arquitetura da plataforma com o Biztalk Server
Arquitetura da plataforma com o Biztalk ServerArquitetura da plataforma com o Biztalk Server
Arquitetura da plataforma com o Biztalk ServerMarkus Christen
 
Publisher subscriber pattern
Publisher subscriber patternPublisher subscriber pattern
Publisher subscriber patternDaeMyung Kang
 
Learn design pattern-1
Learn design pattern-1Learn design pattern-1
Learn design pattern-1Daniel Lim
 
Design pattern 4
Design pattern 4Design pattern 4
Design pattern 4Daniel Lim
 
예제로 보는 Pattern 연상법
예제로 보는 Pattern 연상법예제로 보는 Pattern 연상법
예제로 보는 Pattern 연상법hyun soomyung
 
Reactive Model-View-ViewModel Architecture
Reactive Model-View-ViewModel ArchitectureReactive Model-View-ViewModel Architecture
Reactive Model-View-ViewModel ArchitectureGyuwon Yi
 
서버 개발자가 바라 본 Functional Reactive Programming with RxJava - SpringCamp2015
서버 개발자가 바라 본 Functional Reactive Programming with RxJava - SpringCamp2015서버 개발자가 바라 본 Functional Reactive Programming with RxJava - SpringCamp2015
서버 개발자가 바라 본 Functional Reactive Programming with RxJava - SpringCamp2015NAVER / MusicPlatform
 
Proxy pattern
Proxy patternProxy pattern
Proxy patternscor7910
 

Viewers also liked (13)

Design patterns 스터디 - Singleton 패턴
Design patterns 스터디 - Singleton 패턴Design patterns 스터디 - Singleton 패턴
Design patterns 스터디 - Singleton 패턴
 
Design Pattern 3
Design Pattern 3Design Pattern 3
Design Pattern 3
 
Api design for c++ pattern
Api design for c++ patternApi design for c++ pattern
Api design for c++ pattern
 
Design patterns 스터디 -strategy패턴
Design patterns 스터디 -strategy패턴Design patterns 스터디 -strategy패턴
Design patterns 스터디 -strategy패턴
 
Arquitetura da plataforma com o Biztalk Server
Arquitetura da plataforma com o Biztalk ServerArquitetura da plataforma com o Biztalk Server
Arquitetura da plataforma com o Biztalk Server
 
Publisher subscriber pattern
Publisher subscriber patternPublisher subscriber pattern
Publisher subscriber pattern
 
Learn design pattern-1
Learn design pattern-1Learn design pattern-1
Learn design pattern-1
 
4. publish / subscribe
4. publish / subscribe4. publish / subscribe
4. publish / subscribe
 
Design pattern 4
Design pattern 4Design pattern 4
Design pattern 4
 
예제로 보는 Pattern 연상법
예제로 보는 Pattern 연상법예제로 보는 Pattern 연상법
예제로 보는 Pattern 연상법
 
Reactive Model-View-ViewModel Architecture
Reactive Model-View-ViewModel ArchitectureReactive Model-View-ViewModel Architecture
Reactive Model-View-ViewModel Architecture
 
서버 개발자가 바라 본 Functional Reactive Programming with RxJava - SpringCamp2015
서버 개발자가 바라 본 Functional Reactive Programming with RxJava - SpringCamp2015서버 개발자가 바라 본 Functional Reactive Programming with RxJava - SpringCamp2015
서버 개발자가 바라 본 Functional Reactive Programming with RxJava - SpringCamp2015
 
Proxy pattern
Proxy patternProxy pattern
Proxy pattern
 

Similar to Observer pattern dragor

Reactive Programming with Rxjs
Reactive Programming with RxjsReactive Programming with Rxjs
Reactive Programming with RxjsSangHun Lee
 
랩발제 20131106
랩발제 20131106랩발제 20131106
랩발제 20131106Sumi Kim
 
Io t에서의 소프트웨어단위테스트_접근사례
Io t에서의 소프트웨어단위테스트_접근사례Io t에서의 소프트웨어단위테스트_접근사례
Io t에서의 소프트웨어단위테스트_접근사례SangIn Choung
 
머신러닝의 개념과 실습
머신러닝의 개념과 실습머신러닝의 개념과 실습
머신러닝의 개념과 실습Byoung-Hee Kim
 
[부스트캠프 Tech Talk]손정현_PUB/SUB를 적용한 Todo앱 만들기(순한맛)
[부스트캠프 Tech Talk]손정현_PUB/SUB를 적용한 Todo앱 만들기(순한맛)[부스트캠프 Tech Talk]손정현_PUB/SUB를 적용한 Todo앱 만들기(순한맛)
[부스트캠프 Tech Talk]손정현_PUB/SUB를 적용한 Todo앱 만들기(순한맛)CONNECT FOUNDATION
 
7th.lecture.middle.pt.guideline
7th.lecture.middle.pt.guideline7th.lecture.middle.pt.guideline
7th.lecture.middle.pt.guidelineJeongeun Kwon
 

Similar to Observer pattern dragor (7)

Reactive Programming with Rxjs
Reactive Programming with RxjsReactive Programming with Rxjs
Reactive Programming with Rxjs
 
랩발제 20131106
랩발제 20131106랩발제 20131106
랩발제 20131106
 
Io t에서의 소프트웨어단위테스트_접근사례
Io t에서의 소프트웨어단위테스트_접근사례Io t에서의 소프트웨어단위테스트_접근사례
Io t에서의 소프트웨어단위테스트_접근사례
 
머신러닝의 개념과 실습
머신러닝의 개념과 실습머신러닝의 개념과 실습
머신러닝의 개념과 실습
 
[부스트캠프 Tech Talk]손정현_PUB/SUB를 적용한 Todo앱 만들기(순한맛)
[부스트캠프 Tech Talk]손정현_PUB/SUB를 적용한 Todo앱 만들기(순한맛)[부스트캠프 Tech Talk]손정현_PUB/SUB를 적용한 Todo앱 만들기(순한맛)
[부스트캠프 Tech Talk]손정현_PUB/SUB를 적용한 Todo앱 만들기(순한맛)
 
7th.lecture.middle.pt.guideline
7th.lecture.middle.pt.guideline7th.lecture.middle.pt.guideline
7th.lecture.middle.pt.guideline
 
12books
12books12books
12books
 

Observer pattern dragor

  • 2. 본 PPT는 Design Patterns Study를 위해 작성되었습니다. Study에 사용한 교재는 한빛미디어에서 나온 [Head First Desgin Patterns]을 사용하였습니다. Written by 서울시립대 이희태 For study with NHN NEXT2기 조현호 서 울 시 립 대 이 희 태
  • 3. 옵저버 패턴?? 게임 스타크래프트 프로토스의 유닛 옵저버를 기억하는가? 이 유닛은 정작 본인은 보이지 않으면서 적 진영을 훤히 꾀 뚫어보는 말그대로 “관측”에 타고난 유닛이다. 옵저버 패턴 역시 “관측”하는 Observer들과 관측할 대상 인 Subject로 구성된 패턴이다. 이 패턴을 공부하면서 일대다 관계와 느슨한 결합도 알아보 자.
  • 4. 업무 계약 체결서 저희 회사의 차세대 인터넷 기반 기상 정보 스테이션 구축 프로 젝트 업체로 선정된 것을 축하합니다! 기상 정보 스테이션은 저희 회사에서 현재 특허 출원 중인 WeatherData객체를 바탕으로 만들어질 것입니다. 이 객체는 현 재의 기상조건(기온, 습도, 기압)을 추적하는 객체입니다. 기본적으로 세 개의 항목을 화면에 표시하는 애플리케이션을 만 들어주시길 바랍니다. 세 개의 항목은 각각 현재 조건, 기상 통계, 그리고 간단한 기상 예보이며, 이 세 항목 모두 WeatherData객체 에서 최신 측정치를 수집할 때마다 실시간으로 갱신됩니다. (… …) 여러분이 개발한 디자인과 알파버전을 기다리겠습니다. - From 조니 허리케인, CEO of Weather-O-Rama
  • 5. 온도 습도 기압 기상 스테이션 WeatherData 객체 1) 기상통계 2) 기상예보 3) 현재조건 기상 조건이 변하면? 즉각 반영하여 데이터 취득 화면에 표시
  • 6. 코드를 옵저버 패턴 쓰지 않고 만든 경우 Interface가 아닌 구체적인 구현으로 코드를 짰다. 3개의 display모두 공통된 인자를 받아들이면서 update()를 사용하기 에 추상화를 하는 것이 낫다. Display마다 달라지는 update()항목은 따로 빼서 캡슐화하는 것이 좋다.
  • 7. 그렇다면 옵저버 패턴이란 무엇인가? Subject obj 2 obj 1 obj 3 obj 4 Observer Pattern : 한 객체(subject)의 상태가 바뀌면 그 객체에 의존하는 다른 객체들(observers)한테 연락이 가고 자동으로 내 용이 갱신되는 방식의 일대다 의존성 관계이다. 1 : 多 관계
  • 8. 옵저버 패턴 ≒ 신문 구독 신청 1대多관계에서의 등록!, 해지! 그
  • 9. 구독신청 할 텐가? John(28) 일단 이것저 것 구독 신청 한 후 안 읽 는 스타일 Bob(34) 구독료에 민 감하게 반응 하는 스타일 Maggie(29) 한번 구독하면 잘 끊지 못하는 스타일
  • 10. 여기 두 신문사와 세 명의 잠재 고객이 있다. John(28) Bob(34) Maggie(29) Fire Daily EXTRA NEWS
  • 11. 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!
  • 12. 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등록
  • 14. 디자인 원칙 2. 느슨한 결합 LOOSE COUPLING 1. Subject가 Observer객체에 대해서 아는 것은 오직 observer가 특정 Interface를 구현한다는 것 뿐이다. 2. Observer객체의 추가/제거는 언제든지 할 수 있다. 3. 새로운 형식의 Observer를 추가하려고 한다 해도 Subject를 전혀 변 경할 필요가 없다. 4. Subject와 Observer는 서로 독립적으로 재사용할 수 있다. 서로 상호작용하는 객체 사이에서는 가능하면 느슨하게 결합(하는 디자인을 사용해야 한다.
  • 15. 기상 스테이션 설계 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
  • 16. 기상 스테이션 구현 (1) Subject, Observer, DisplayElement interface
  • 17. 기상 스테이션 구현 (2) weatherData객체
  • 19. 기상 스테이션 구현 (3) - ① Display 객체 구현 – CurrentConditions
  • 20. 기상 스테이션 구현 (3) - ② StatisticsDisplay
  • 21. 기상 스테이션 구현 (3) - ③ ForecastDisplay
  • 24. 자바 내장 옵저버 패턴 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
  • 25. 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()를 위해 사용됨
  • 26. public void notifyObservers(Object arg) : hasChanged()가 실행되어 이 객체가 변하면, 객체에 등록된 모든 observer들에게 바뀐 정보를 알려준 후 clearChanged()가 실행되어 더 이상의 변화가 없도록 한다. 각각의 observer들은 두 개의 매개변수를 받는 update(observable o, object arg) 메소드를 구현해야한다. notifyObservers() 메소드
  • 27. 알리는 방식은 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!)
  • 28. 옵저버가 연락 받는 방법 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()로 표현
  • 29. PULL 방식으로 구현 Java.util.Observable, java.util.Observer을 통한
  • 31. CONSOLE 출력 결과 (PULL) 이전의 출력과 비교했을 때 순서가 바뀌었다? 사실 순서라는 것이 의미가 없다. 옵저버한테 연락이 가는 순서에 의존하면 절대 안된다.
  • 32. 요 약 정 리 • 옵저버 패턴에서는 관찰대상인 Subject(Observable) 와 관찰하는 Observer와의 1대 多관계를 정의한다. • Observable객체와 Observer객체 사이의 결합은 느 슨한 결합이다. • 옵저버 패턴을 이용하면 Observable객체에서 데이터 를 보내거나(push), Observer가 데이터를 가져오는 (pull) 방식을 쓸 수 있다. • 스윙 및 여러 gui프레임워크에서도 옵저버패턴이 많 이 응용된다.