Observer Pattern (옵저버 패턴)
Observer pattern
정의
한 객체의 상태가 바뀌면 그 객체에 의존하는 다른 객체들이 자동으로 갱신되는 방식으로 객체들 간에 one-to-many 의존성을 정의한다. 객체의 상태 변화를 관찰하는 Observer들을 객체에 등록하여 상태 변화가 있을 경우 객체가 메소드를 통해 Observer들에게 알리는 Design pattern이다. 주로 분산 이벤트 핸들링을 구현하는데 사용하거나, 하나의 객체에 여러 개가 의존할 경우 사용하는 것이 대부분이다.
l 자바에는 java.util.Observable이라는 API가 있다. 하지만 interface가 아니라 class이기에 이미 다른 super class를 extends하고 있는 class에서는 사용할 수 없다는 점과, 직접 구현이 불가능하다는 단점이 존재한다. 그리고, 핵심 method(‘setChange()’)는 protected로 선언이 되어있기때문에 해당 method를 외부에서 사용하는 것이 불가능하다 라는 단점이 있다.
조건
Loose-Coupling : 필요한 이유는 객체 간의 결합도가 높아질수록 유지보수는 힘들기 때문이다. Loose-Coupling의 특징으로는 주체가 observer에 대해서 observer interface를 implement하고 있다는 점을 제외하고는 알 수 있는 정보가 없다. Loose-Coupling의 장점은 Observer를 언제든지 추가할 수 있고, 새로운 Observer라 해도 주체를 변경할 필요가 없으며 주체와 observer를 독립적으로 사용할 수 있다. 또한 Observer가 바뀌어도 서로 영향을 미치지 않는다는 것이다.
구성
2개의 역할을 하는 interface(subject, observer)를 생성한다. subject라는 interface는 observer들을 관리하는 method들을 가진다. 이 method들은 observer를 add, delete, notifyObserver 이렇게 3가지 역할을 한다. Observer interface는 정보를 업데이트 해주는 update method를 가진다. Subject를 implment한 class는 정보를 제공하는 subject가 되며 observer 객체들을 가진다. 그리고 observer interface를 implement한 class는 notifyObserver method를 호출하면서 알려줄 때마다 update method가 호출된다.
정리
1. Observer pattern은 한 object의 state가 바뀌면 해당 object에 의존하는 다른 object들에게 신호를 보내고 자동으로 정보가 갱신되는 1:N의 관계를 가진다.
2. 연결은 interface를 이용하여 loose-coupling을 유지한다.
3. Observer pattern은 push 방식(주체 object에서 observer로 데이터를 보내는 방식)과 pull 방식(observer에서 주체 object의 데이터를 가져가는 방식)으로 언제든지 구현할 수 있다.
4. JAVA에서는 Observable class와 Observer interface를 제공한다.
구현 (팬관리)
'SW > DesignPattern' 카테고리의 다른 글
Singleton Pattern (싱글턴 패턴) (0) | 2017.09.05 |
---|---|
Factory Pattern (팩토리 패턴) (0) | 2017.09.05 |
Decorator Pattern (데코레이터 패턴) (0) | 2017.09.05 |
Strategy Pattern (스트레테지 패턴) (0) | 2017.09.05 |
DesignPattern이란? 왜쓰지? (0) | 2017.09.05 |