[Design pattern] 감시자 Observer
패턴
- 감시자(Observer) 패턴
의도
- 객체 사이에 일 대 다수의 의존 관계를 정의해 두어, 어떤 객체의 상태가 변할 때 그 객체에 의존성을 가진 다른 객체들이 그 변화를 통지 받고 자동으로 갱신될 수 있게 만든다.
키워드
- 데이터에 대한 감시자의 자동 갱신
다른 이름
- 종속자(Dependent), 게시-구독(Publish-Subscribe)
동기
1. 어떤 하나의 시스템을 서로 연동되는 클래스 집합으로 분할했을 때 발생하는 공통적인 부작용은 관련된 객체 간에 일관성을 유지하도록 해야 한다는 것이다.
2. 그렇다고 이 일관성 관리를 위해서 객체간의 결합도를 높이고 싶지는 않다. 이유는 각 클래스의 재사용성이 떨어지기 때문이다.
동기 예제.
- 그래픽 사용자 인터페이스 툴킷을 예로 든다. 툴킷은 표현 부분과 이에 대응하는 데이터를 분리한다. 응용프로그램 자료와 표현을 정의하는 클래스는 재사용 할 수 있다. 그러나 이들은 함께 동작해야 한다.
1. 테이블 형태의 객체와 바 형태로 표현된 객체 모두 동일한 자료 값을 나타내나, 스프레드시트와 바는 서로 관련 없는 클래스 들이므로 독립적으로 재사용이 가능해야 한다.
2. 만일, 이 독립적 객체가 하나의 정보 값을 표현하는데 함께 사용된다면, 사용자가 스프레드시트에서 정보를 변경할 때 바에도 이 변경 정보가 반영되어야 한다.
3. 스프레드 시트와 바 차트는 데이터 객체에 종속적이기 때문에 그 데이터에 일어난 변경을 통보 받아야 한다.
4. 예 처럼, 종속적인 객체가 두개로 제한되는 것은 아니다.
패턴 소개
1. 감시자 패턴은 이런 관련성을 관리하는 패턴이다.
2. 이 패턴에서 중요한 객체는 주체(subject)와 감시자(observer)이다.
3. 주체는 독립된 여러 개의 감시가 있을 수 있다.
4. 모든 감시자는 주체의 상태 변화가 있을 때마다 변화의 통보를 받는다.
5. 이런 종류의 상호 작용을 게시-구독 관계라고 한다.
6. 불특정 다수의 감시자가 이 통보를 수신하기 위해서 구독을 신청하는 것이다.
활용성
1. 어떤 추상 개념이 두 가지 양상을 갖고 하나가 다른 하나에 종속적일 때. 각 양상을 별도의 객체로 캡슐화하여 이들 각각을 재 사용할 수 있다.
2. 한 객체에 가해진 변경으로 다른 객체를 변경해야 하고, 프로그래머들은 얼마나 많은 객체들이 변경되어야 하는지 몰라도 될때.
3. 어떤 객체가 다른 객체에 자신의 변화를 통보할 수 있는데, 그 변화에 관심있어 하는 객체들이 누구인지에 대한 가정 없이도 그러한 통보가 될 때.
구조도
1. Subject
- 감시자들을 알고 있는 주체
2. Observer
- 주체에 생긴 변화에 관심있는 객체를 갱신하는데 필요한 인터페이스들을 정의한다.
3. ConcreteSubject
- ConcreteObserver 객체에게 알려주어야 하는 상태를 저장한다. 또한 이 상태가 변경될 때 감시자에게 통보한다
4. ConcreteObserver
- ConcreteSubject 객체에 대한 참조자를 관리한다. 주체의 상태와 일관성을 유지해야 하는 상태를 저장한다.
- 주체의 상태와 감시자의 상태를 일관되게 유지하는데 사용하는 갱신 인터페이스를 구현한다.
협력관계
결과
1. Subject와 Observer 클래스 간에는 추상적인 결합도만이 존재.
2. 브로드캐스트(broadcast) 방식의 교류가 가능.
3. 예측하지 못한 정보를 갱신한다.