글
- 예제 코드 Diagram -
쉽게 이해하자면,
출판사(Subject:주제) + 구독자(Observer) = Observer Pattern.
* Observer Pattern :
- 한 객체의 상태가 바뀌면 그 객체에 의존하는 다른 객체들한테 연락이 가고,
자동으로 내용이 갱신되는 방식으로 일대다(one-to-many) 의존성을 정의한다.
* 느슨한 결합 (Loose Coupling)
- 두 객체가 상호작용을 하긴 하지만 서로에 대해 잘 모른다!
- Observer Pattern 에서는 이러한 디자인을 제공한다. Why ?
(1) Subject 가 Observer 에 대해서 아는 것은 Observer 가 특정 인터페이스를 구현한다는 것 뿐이다.
(2) Observer 는 언제든지 추가, 삭제할 수 있다.
(3) 새로운 타입의 Observer 를 추가하려고 해도 Subject 를 변경할 필요가 전혀 없다.
(4) Subject 와 Observer 는 서로 독립적으로 사용이 가능하다.
(4) Subject 또는 Observer 가 바뀌더라도 서로한테 영향을 미치지 않는다.
* Push 방식 vs. Pull 방식
Push 방식 : Subject 는 데이터가 변경될 때 마다 Observer 들에게 알려준다.
- 장점
Observer 는 Subject 에게 따로 데이터를 요청할 필요가 없다.
- 단점
Observer 가 불필요한 데이터까지 받아야 되는 경우가 생긴다.
Pull 방식 : Observer 가 갱신된 데이터가 필요할 때 Getter 메소드를 이용해 Subject 로부터 데이터를 가져온다.
- 장점
Observer 는 필요한 데이터만 가져올 수 있다.
Subject 가 확장되더라도 Subject 는 notify 메소드를 수정할 필요없이 Getter 메소드만 추가하면 된다.
- 단점
Observer 는 필요한 데이터가 많을 수록 Getter 메소드를 여러 번 호출해야만 한다.
(Pull 방식이 더 옳은 것으로 간주된다고 한다)
* java.util.Observable, java.util.Observer
(이미지 출처 : http://dellabate.wordpress.com/2012/03/03/gof-patterns-observer/)
- 처음의 Diagram 에서는 인터페이스를 이용해 Observer Pattern 을 구현했지만
바로 위의 이미지와 같이 Java 에서 API 로 지원하기도 한다.
- Observable 의 주의점*
1) Interface 가 아닌 Class 라는 점!
- 구현이 아닌 인터페이스에 맞춰서 프로그래밍 한다는 객체지향의 원칙 3)에 위배된다.
- 클래스이기 때문에 서브클래스를 만들어야 한다는 것이 문제.
이미 다른 수퍼클래스를 확장하고 있는 클래스에 Observable 의 기능을 추가할 수 없기 때문이다.
그래서 재사용성에 제약이 생기게 된다.
- Observable 인터페이스가 없어 Java 의 Observer API 하고 잘 맞는 클래스를 직접 구현하는 것이 불가능.
2) Observable 클래스의 핵심 메소드를 외부에서 호출할 수 없다!
- protected 로 선언된 setChanged(), clearChanged() 는 Observable 의 서브클래스에서만 호출 가능하다.
- 상속보다는 구성을 활용한다는 객체지향의 원칙 2)에 위배된다.
* 객체지향의 원칙 :
1) 바뀌는 부분은 캡슐화 한다.
2) 상속보다는 구성을 활용한다. - Subject 와 Observer 사이의 관계는 상속이 아니라 구성에 의해 이루어진다!
3) 구현이 아닌 인터페이스에 맞춰서 프로그래밍 한다.
4) 서로 상호작용을 하는 객체 사이에서는 가능하면 느슨하게 결합하는 디자인을 사용해야 한다.
이 장에서의 정리 :
- Subject (또는 Observable 객체) 는 동일한 인터페이스를 써서 Observer 에게 연락을 한다.
- Observer Pattern 은 Swing 및 여러 GUI 프레임워크, JavaBeans 나 RMI 같이 광범위하게 쓰인다.
ex ) Swing API 에서 JButton 의 ActionListener 등록
'Programming > Design Pattern' 카테고리의 다른 글
Head First : Design Patterns - 제5강 : Singleton 패턴 (0) | 2014.05.20 |
---|---|
Head First : Design Patterns - 제4강 : Factory 패턴 (0) | 2014.05.19 |
Head First : Design Patterns - 제3강 : Decorator 패턴 (0) | 2014.05.18 |
Head First : Design Patterns - 제1강 : Strategy 패턴 (0) | 2014.05.16 |
[디자인패턴]MVC, MVP and MVVM (0) | 2013.12.19 |
RECENT COMMENT