Observer Pattern

디자인 원칙

  • 서로 상호작용 하는 객체 사이에서는 가능한 느슨한 결합을 한다.
    • 두 객체가 느슨하게 결합되어 있다 == 상호작용을 하지만 서로에 대해 잘 모른다
    • 즉, 주제(subject)는 옵저버가 특정 인터페이스를 구현한다는 것만 알고 있을 뿐 구상 클래스가 무엇인지, 무슨 일을 하는지 등에 대해서는 알 필요가 없다.
    • 주제와 옵저버는 서로 독립적으로 재사용 가능하며, 어느 하나가 바뀌더라도 서로에게 영향을 미치지 않는다.

패턴 정의

observer pattern에서는 한 객체의 상태가 바뀌면 그 객체에 의존하는 다른 객체들한테 연락이 가고 자동으로 갱신한다. 따라서 일련의 객체들 사이에서 일대다 관계를 정의한다.

예시

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

public interface Observer {
    public void update();
}

자바 내장 옵저버

import java.util.Observable;
import java.util.Observer;

Observable 클래스에서 모든 옵저버들을 관리해준다. 위의 예시처럼 register(), remove(), notify() 메소드가 더 이상 필요 없다.

단점

  • 인터페이스가 아닌 클래스다.
    • 서브클래스를 만들어서 사용하기 때문에 재사용성에 제약이 생긴다.
    • 자바에 내장된 Observer API 하고 잘 맞는 클래스를 직접 구현하는 것이 불가능하다.
  • Observable 클래스의 핵심 메소드를 외부에서 호출할 수 없다.
    • setChanged() 메소드가 protected로 선언되어 있기 때문에 Observable의 서브클래스에서만 호출할 수 있다.

참고

  • Head First Design Patterns