2010년 1월 20일 수요일

디자인 패턴의 두번째! 옵저버 패턴(Observer Pattern)

옵저버 패턴이란?

  한 객체의 상태가 바뀌면 그 객체에 의존하는 다른 객체들한테 연락이 가고

자동으로 내용이 갱신되는 방식으로 일대다(one-to-many)의 의존성을 정의

 

옵저버 패턴의 요소

  주제(subject) 객체 - 데이터가 바뀌면 옵저버 객체들에게 전달,

                               옵저버가 될 객체의 등록 및 제거

  옵저버(observer) 객체 - 주제의 데이터가 바뀌면 갱신 내용을 전달 받음

 

 

일대다 관계는 주제와 옵저버에 의해 정의되고 옵저버는 주제에 의존됨.

 

느슨한 결합(Loose Coupling)

  느슨하게 결합되어 있다는 것은 그 둘이 상호작용을 하긴 하지만 서로에 대해

잘 모른다는 것을 의미하며 서로 상호작용을 하는 객체 사이에서는 가능하면

느슨하게 결합하는 디자인을 사용해야 함

  - 느슨하게 결합하는 디자인을 사용하면 변경사항이 생겨도 무난하게 처리할 수 있는

유연한 객체지향 시스템을 구축할 수 있다(객체 사이의 상호의존성을 최소화 할 수 있기 때문)

 

옵저버 패턴에서는 주제와 옵저버가 느슨하게 결합되고 있는

객체 디자인을 제공

  - 주제가 옵저버에 대해 아는것은 옵저버가 특정 인터페이스를 구현 한다는 것 뿐

  - 옵저버는 언제든지 새로 추가 가능

  - 새로운 형식의 옵저버를 추가하려고 할 때도 주제를 변경할 필요가 전혀 없음

  - 주제와 옵저버는 서로 독립적으로 재사용 할 수 있음

  - 주제나 옵저버가 바뀌더라도 서로에게 영향을 미치지 않음

 

<옵저버 패턴 클래스 다이어그램>

 

자바 내장 옵저버 패턴

  - Observer 인터페이스와 Observable 클래스로 구현되어 있음

  - 많은 기능들을 제공하고 푸시(Push)방식과 풀(Pull)방식 사용 가능

  - 푸시방식은 데이터를 메소드의 인자로 전달하는 데이터 객체 형태로 전달

  - 풀방식은 옵저버에서 전달받은 Observable 객체로부터 원하는 데이터를 가져가는 방식

자바 내장 옵저버 패턴의 단점

  - Observable은 클래스

  - 서브 클래스를 만들어야 됨(재사용성에 제약 생김)

  - Observable 인터페이스라는 것이 없기 때문에 자바에 내장된 Observer API하고

     잘 맞는 클래스를 직접 구현한다는 것이 불가능

  - Observable 클래스의 핵심 메소드를 외부에서 호출 할 수 없음

  - Observable 메소드를 살펴보면 setChanged() 메소드가 protected로 선언되어

    있기 때문에 서브 클래스 에서만 호출이 가능

    (상속보다는 구성을 사용한다는 디자인 원칙에 위배됨)

 

출처 : Head First Disign Patterns

댓글 없음:

댓글 쓰기