Observer Pattern
뭔가 중요한 일이 일어났을 때 객체들한테 새 소식을 알려줄 수 있는 패턴이다. 객체 쪽에서는 계속해서 정보를 받을지 여부를 실행 중에 결정할 수 있다.
1. Observer Pattern의 정의
Observer Pattern이란 한 객체의 상태가 바뀌면 그 객체에 의존하는 다른 객체들한테 연락이 가고 자동으로 내용이 갱신되는 방식으로 일대다(one-to-many)의존성을 정의한다.
2. Observer Pattern의 특징
옵저버 패턴에서는 주제와 옵저버에 의해 일대다 관계를 정의된다. 옵저버는 주제객체에 의존하기 때문에 주제객체의 상태가 바뀌면 주제객체에 의존하는 모든 옵저버 객체에게 연락이 간다. 연락 방법에 따라 옵저버에 있는 값이 새로운 값으로 갱신될 수도 있다. Observer Pattern을 구현하는 방법에는 여러 가지가 있지만, 대부분 주제(subject)인터페이스와 옵저버(observer)인터페이스가 들어있는 클래스 디자인을 바탕으로 한다.
- Observer란 관찰자 이다.
- Observer Pattern은 상태 값이 변하는 Subject의 값을 체크하기 위해 생겨났다.
- Publish subscribe패턴이라고 불리우기도 한다. 컨텐츠 발행자(Subject)가 컨텐츠의 변화가 생겼을 때 구독자(Observer)에게 알려주는 방식과 비슷하기 때문이다.
- Observer는 2개 이상 존재 할 수 있다. 1:N
- Observer가 취하는 값은 읽기 전용으로 간주한다.
3. Observer Pattern의 클래스 다이어그램
? 주제(subject) : 데이터가 바뀌면 새로운 데이터 값을 옵저버들에게 보내 주는 객체
? 옵저버(observer) : 주제의 데이터가 변경되면 갱신내용을 받는 객체
4. Observer Pattern의 구성
A. 주제를 나타내는 subject 인터페이스 객체에서 옵저버로 등록하거나 옵저버 목록에서 탈퇴하고 싶을 때는 이 인터페이스에 있는 메소드를 사용한다.
B. 옵저버가 될 가능성이 있는 객체에서는 반드시 observer 인터페이스를 구현해야 한다. 이 인터페이스에는 주제의 상태가 바뀌었을 때 호출되는 메소드가 있다.
C. 주제 역할을 하는 구상 클래스에서는 항상 subject인터페이스를 구현해야 한다. 주제 클래스에서는 등록 및 해지를 위한 메소드 외에 상태가 바뀔 때마다 모든 옵저버들에게 연락하기 위한 메소드도 구현해야 한다.
D. Observer 인터페이스만 구현한다면 무엇이든 옵저버 클래스가 될 수 있다. 각 옵저버는 특정 주제 객체에 등록을 해서 연락을 받을 수 있다.
5. Observer Pattern에서 느슨한 결합(Loose Coupling)의 위력
옵저버 패턴에서는 주제와 옵저버가 느슨하게 결합되어 있는 개체 디자인을 제공한다. 두 객체가 느슨하게 결합되어 있다는 것은 그 둘이 상호작용을 하긴 하지만 서로에 대해 잘 모른다는 것을 의미한다. 주제가 옵저버에 대해서 아는 것은 옵저버가 특정 인터페이스를 구현 한다는 것뿐이며, 옵저버는 언제든지 새로 추가하거나 제거 할 수 있다. 새로운 형식의 옵저버를 추가하려고 할 때도 주제를 전혀 변경할 필요가 없으며, 주제와 옵저버는 서로 독립적으로 재사용할 수 있다. 주제나 옵저버가 바뀌더라도 서로한테 영향을 미치지는 않는다. 이런 관계를 느슨한 결합이라고 하며 느슨하게 결합하는 디자인을 사용하면 변경 사항이 생겨도 무난히 처리할 수 있는 유연한 객체지향 시스템을 구출할 수 있다. 객체 사이의 상호의존성을 최소화할 수 있기 때문이다.
6. 주제가 옵저버한테 상태 정보를 전달하는 두 가지 방식
주제가 옵저버한테 상태 정보를 전달하는 방식에는 두 가지가 있다. 주제객체에서 데이터를 보내는 방식인 푸시방식과 옵저버가 데이터를 가져오는 방식인 풀 방식이 있다. 두 가지 방식 중에는 풀 방식을 더 옳은 것으로 간주한다.
옵저버 패턴에서는 한 객체의 상태가 바뀌면 그 객체에 의존하는 다른 객체들한테 연락이 가고 자동으로 내용이 갱신되는 방식으로 일대다(one-to-many) 의존성을 정의합니다.
'Design Patterns' 카테고리의 다른 글
스트래티지 패턴 2 (Head First 파헤치기 ver.1) (0) | 2009.11.12 |
---|---|
스트래티지 패턴(Strategy Pattern) (0) | 2009.11.12 |
Singleton Pattern - (0) | 2009.11.11 |
생성 패턴-Factory (0) | 2009.11.11 |
패턴의 정의 JSTOM (0) | 2009.11.11 |