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의 서브클래스에서만 호출할 수 있다.
- setChanged() 메소드가
참고
- Head First Design Patterns