옵저버 패턴이란?
한 객체의 상태가 바뀌면 그 객체에 의존하는 다른 객체들한테 연락이 가고
자동으로 내용이 갱신되는 방식으로 일대다(one-to-many)의 의존성을 정의
옵저버 패턴의 요소
주제(subject) 객체 - 데이터가 바뀌면 옵저버 객체들에게 전달,
옵저버가 될 객체의 등록 및 제거
옵저버(observer) 객체 - 주제의 데이터가 바뀌면 갱신 내용을 전달 받음

일대다 관계는 주제와 옵저버에 의해 정의되고 옵저버는 주제에 의존됨.
느슨한 결합(Loose Coupling)
느슨하게 결합되어 있다는 것은 그 둘이 상호작용을 하긴 하지만 서로에 대해
잘 모른다는 것을 의미하며 서로 상호작용을 하는 객체 사이에서는 가능하면
느슨하게 결합하는 디자인을 사용해야 함
- 느슨하게 결합하는 디자인을 사용하면 변경사항이 생겨도 무난하게 처리할 수 있는
유연한 객체지향 시스템을 구축할 수 있다(객체 사이의 상호의존성을 최소화 할 수 있기 때문)
옵저버 패턴에서는 주제와 옵저버가 느슨하게 결합되고 있는
객체 디자인을 제공
- 주제가 옵저버에 대해 아는것은 옵저버가 특정 인터페이스를 구현 한다는 것 뿐
- 옵저버는 언제든지 새로 추가 가능
- 새로운 형식의 옵저버를 추가하려고 할 때도 주제를 변경할 필요가 전혀 없음
- 주제와 옵저버는 서로 독립적으로 재사용 할 수 있음
- 주제나 옵저버가 바뀌더라도 서로에게 영향을 미치지 않음

<옵저버 패턴 클래스 다이어그램>
자바 내장 옵저버 패턴
- Observer 인터페이스와 Observable 클래스로 구현되어 있음
- 많은 기능들을 제공하고 푸시(Push)방식과 풀(Pull)방식 사용 가능
- 푸시방식은 데이터를 메소드의 인자로 전달하는 데이터 객체 형태로 전달
- 풀방식은 옵저버에서 전달받은 Observable 객체로부터 원하는 데이터를 가져가는 방식
자바 내장 옵저버 패턴의 단점
- Observable은 클래스
- 서브 클래스를 만들어야 됨(재사용성에 제약 생김)
- Observable 인터페이스라는 것이 없기 때문에 자바에 내장된 Observer API하고
잘 맞는 클래스를 직접 구현한다는 것이 불가능
- Observable 클래스의 핵심 메소드를 외부에서 호출 할 수 없음
- Observable 메소드를 살펴보면 setChanged() 메소드가 protected로 선언되어
있기 때문에 서브 클래스 에서만 호출이 가능
(상속보다는 구성을 사용한다는 디자인 원칙에 위배됨)
출처 : Head First Disign Patterns
댓글 없음:
댓글 쓰기