티스토리 뷰

Observer Pattern - 디자인 패턴

 
참고서적 :  Head First Design Pattern
소스코드 다운로드 : http://www.wickedlysmart.com/headfirstdesignpatterns/code.html
 
패턴 정의 #2 - Observer Pattern
옵저버 패턴(Observer Pattern)에서는 한 객체의 상태가 바뀌면 그 객체에 의존하는 다른 객체들한테 연락이 가고
자동으로 내용이 갱신되는 방식으로 일대다(one-to-many) 의존성을 정의합니다.
 
디자인 원칙
1. 서로 상호작용을 하는 객체 사이에서는 가능하면 느슨하게 결합하는 디자인을 사용해야 한다.
 
옵저버 패턴은 주제(Subject)와 옵저버(Observer)에 의해 정의됩니다.
옵저버는 주제에 의존하고, 주제의 상태가 바뀌면 옵저버에게 연락이 갑니다.
연락 방법에 따라 옵저버에 있는 값이 새로운 값으로 갱신될 수도 있습니다.
 


 
- 주제를 나타내는 Subject 인터페이스는 객체에서 옵저버로 등록하거나 옵저버 목록에서 탈퇴하고 싶을 때 이 인터페이스의 메소드를 사용합니다.
- 주제 역할을 하는 구상 클래스에서는 항상 Subject 인터페이스를 구현해야 합니다.
주제 클래스에서는 등록 및 해지를 위한 메소드 외에 상태가 바뀔 때마다 모든 옵저버들에게 연락을 하기 위한 notifyObservers() 메소드를 구현해야 합니다.
- 주제 클래스에는 상태를 설정하고 알아내기 위한 setter/getter 메소드가 들어 있을 수 있습니다.
- 각 주제마다 여러 개의 옵저버가 있을 수 있습니다.
- 옵저버가 될 가능성이 있는 객체에서는 반드시 Observer 인터페이스를 구현해야 합니다.
이 인터페이스에는 주제의 상태가 바뀌었을 때 호출되는 update() 메소드만을 포함하고 있습니다.
- Observer 인터페이스만 구현한다면 무엇이든 옵저버 클래스가 될 수 있습니다.
각 옵저버는 특정 주제에 객체에 등록을 해서 연락을 받을 수 있습니다.
 
Observer의 구상 클래스(CurrentConditions, StatisticsDisplay, ForecastDisplay..) 에서 registerObserver()를 이용해 Subject에 등록합니다.
이때 등록한 Subject를 멤버변수로 가지고 있으면, 나중에 removeObserver()를 통해 Subject에서 해제할 수 있습니다.
 
Subject에서 상태가 바뀌었을 때, notifyObservers()를 호출함으로써, 모든 Observer 클래스에서 update()를 수행하게 됩니다.
이 update 함수 호출시에 매개변수로 값을 넘기기도 하고,
Subject에 setter/getter 함수를 두어서 Objsever에서 참조할 수 있도록 처리하기도 합니다.
 
참고로 자바 내장 옵저버 패턴도 있습니다.
Subject 대신에 Observable을 사용합니다. 자세한 사용방법은 첨부 소스의 WeatherStationObservable 폴더를 참고하세요~~
 
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
글 보관함