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

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

classDiagram
    Subject <|-- ConcreteSubject
    Observer <|-- ConcreteObserver
    Subject --> Observer : observer
    ConcreteSubject <-- ConcreteObserver : subject
    class Subject {
        registerObserver()
        notifyObserver()
        removeObserver()
      <<Interface>>
    }
    class Observer {
      update()
      <<Interface>>
    }
    class ConcreteSubject{
        registerObserver()
        notifyObserver()
        removeObserver()
    }
    class ConcreteObserver{
        update()
    }

느슨한 결합의 위력

두 객체가 느슨하게 결합되어 있다는 것은, 그 둘이 상호작용을 하긴 하지만, 서로에 대해 서로 잘 모른다는 것을 의미한다.

옵저버 패턴에서는 주제와 옵저버가 느슨하게 결합되어 있는 객체 디자인을 제공한다.

주제가 옵저버에 대해 하는 것은 옵저버가 특정 인터페이스를 구현한다는 것 뿐이기 때문이다.

옵저버의 구상 클래스가 무엇인지, 옵저버가 무엇을 하는지 등에 대해서는 알 필요가 없다.

또 옵저버는 언제든지 새로 추가할 수 있다. 마찬가지로 아무 때나 제거할 수도 있다.

자바에서 Observer 패턴 사용하기

자바에서는 몇 가지 API를 통해 자체적으로 옵저버 패턴을 제공한다.

위에서 설명한 Subject 인터페이스는 java.util.Observable 클래스로, Observer 인터페이스는 java.util.Observer 인터페이스로 제공된다.

위와 다른 점은 Observable 클래스가 Subject 인터페이스와 다르게 구체 클래스이기 때문에, 실제 사용할 때에는 해당 클래스를 상속받아야 한다는 점이다.

또한 Observable 클래스는 push 방식 뿐만 아니라 poll 방식도 제공하고 있는데,