Head First에서 예제로는,
기상청에서 날씨 정보가 변경되었을시에 몇가지 디스플레이에 날씨 정보를 갱신해주는..
혹은 출판사와 구독자의 관계를 옵저버 패턴으로 설명했다.
java.util.Observer;
java.util.Observable;
java.util에 Observer 인터페이스와 Observable 추상클래스가 존재하는데,
위에서 설명한 예로 보자면 출판사와 기상청은 Observable, 디스플레이와 구독자 같은 대상은 Observer가 된다.
저 두가지 클래스를 이용하면 쉽게 옵저버 패턴을 구현할 수 있다.
간단한 예의 Observable이다. 랜덤 숫자를 옵저버들에게 알려주는 일을 하고 있다.
public class RandomNumberGenerator extends Observable { | |
private Random random = new Random(); | |
public void execute() { | |
for (int i = 0; i < 20; i++) { | |
setChanged(); | |
notifyObservers(random.nextInt(50)); | |
} | |
} | |
} |
이 Observer는 update메서드를 통해서 호출한 Observable객체와 상태값을 전달 받아서 랜덤숫자가 몇인지 확인한다.
public class DigitObserver implements Observer { | |
public DigitObserver(Observable obs) { | |
obs.addObserver(this); | |
} | |
public void update(Observable obs, Object arg) { | |
int count = (Integer) arg; | |
System.out.println("DigitObserver: " + Integer.valueOf(count)); | |
try { | |
Thread.sleep(100); | |
} catch (InterruptedException e) { | |
} | |
} | |
} |
간단한 옵저버 패턴의 예이긴하나 실제로 사용해본적이 없어서 장,단점은 정확하게 집어내기 힘들다.
그래도 단순하게 구지 꼽자면.. 일단 Observable은 Abstract 클래스이기 때문에 다중상속이 안된다.
또 Observer가 하나의 Observable에 속해있단 보장이 없다. 그러면 update에서 instanceof로 Observable을 골라내야 하는것인가..?
아마도 저런 해결책은 이미 존재할꺼라고 생각한다. 처음 접해보는 나같은 사람도 보이는데..;;
해결책에 대한건 내공이 좀 쌓이면 그때 고민해보도록 하자 -_-;
'Design Patterns' 카테고리의 다른 글
Strategy. (0) | 2012.03.03 |
---|---|
"OCP", Open Closed Principle (0) | 2012.02.26 |
"LSP", Liskov Substitution Principle (2) | 2012.02.26 |
"ISP", Interface Segrehation Principle (1) | 2012.02.26 |
"DIP", Dependency Inversion Principle (0) | 2012.02.26 |