프로그래밍/DesignPattern

옵저버 패턴

모지사바하 2007. 7. 2. 22:47
출판사+구독자=옵저버 패턴

1. 신문사가 사업을 시작하고 신문을 찍어내기 시작합니다.

2. 독자가 특정 신문사/잡지사에 구독 신청을 하면 매번 새로운 신문/잡지가 나올 때마다 배달을 받을 수 있습니다. 계속 구독자로 남아있는 이상 계속해서 신문/잡지를 받을 수 있습니다.

3. 신문을 더 이상 보고 싶지 않으면 구독 해지 신청을 합니다. 그러면 더 이상 신문이 오지 않습니다.

4. 신문사가 계속 영업을 하는 이상 여러 개인 독자, 호텔, 항공사 및 기타 회사 등에서 꾸준히 구독 및 해지를 하게 됩니다.

옵저버 패턴(Observer Pattern)에서는 한 객체의 상태가 바뀌면 그 객체에 의존하는 다른 객체들한테 연락이 가고 자동으로 내용이 갱신되는 방식으로 일대다(one-to-many)의존성을 정의합니다.

일대다 관계는 주제와 옵저버에 의해 정의됩니다. 옵저버는 주제에 의존합니다. 주제의 상태가 바뀌면 옵저버(들)한테 연락이 가지요. 연락 방법에 따라 옵저버에 있는 값이 새로운 값으로 갱신될 수도 있습니다.

옵저버 패턴을 구현하는 방법에는 여러 가지가 있지만, 대부분 주제(Subject) 인터페이스와 옵저버(Objserver) 인터페이스가 들어있는 클래스 디자인을 바탕으로 합니다.

public interface Subject{
   public void registerObserver(Observer o);
   public void removeObserver(Observer o);
   public void notifyObservers();
}

public interface Observer{
   public void update(값이 변경되었을때 옵저버들에게 전달될 값);
}

일에 해당하는 클래스에서 Subject를 구현.
registerObserver를 하면 ArrayList에 add.
일에 해당하는 클래스에서 값이 변경됐을때,
값을 변경한 후 notifyObservers를 호출
notifyObservers에서는 for문을 ArrayList size만큼 돌리면서 각 옵저버(옵저버를 구현한 클래스)들의 update를 호출하여 변경된 값을 실시간으로 update.