salsa source

[디자인패턴] Observer패턴 본문

STUDY/디자인패턴

[디자인패턴] Observer패턴

dayofday 2018. 2. 8. 22:16

<출처 : 개발자가 반드시 정복해야 할 객체지향과 디자인 패턴>


실제 Observer 능동적으로 관찰하는 것이 아닌 Subject 역할로부터 전달되는 것을

수동적으로 기다리고 있음 => Publish-Subscribe패턴 이라고도

 

상태가 변경될   정해지지 않은 임의의 객체에게 변경사실을 알려줄 있다.

객체의 상태 변화를 정해지지 않은 여러 다른 객체에게 통지하고 싶을 사용

 


 

주제(subject) 객체와 옵저버 객체

주제객체

옵저버 목록 관리, 옵저버를 등록/제거 있는 메소드 제공

상태변경이 발생하면 등록된 옵저버에 변경 내역 알림

 

concreteSubject : 상태를 가지고 있는 역할

ConcreteObserver : 상태변화를 전달받는 역할

Subject, Observer : 위의 가지 역할을 연결

 

 

 

옵저버 추가

StatusChecker checker = new StatusChecker();

Checker.add(new StatusEmailSender());//옵저버로 등록

 

 

 

장점 : 주제 클래스 변경 없이 상태 변경을 통지 받을 옵저버 추가 가능

 

 

가장 많이 사용되는 영역 : GUI 프로그래밍

예시

버튼이 눌릴 로그인 기능 호출 -> 버튼 : 주제객체, 로그인 모듈 호출객체 : 옵저버

안드로이드~OnClickListener타입 객체를  Button객체에 등록할

OnClickListener 인터페이스 : 옵저버 인터페이스

예시

ModelViewController ~ Model - Observer    View - Subject

Model : 표시 형식에 의존하지 않는 내부 모델을 조작하는 부분

View : Model 어떻게 보일 것인지를 관리하는 부분

일반적으로 하나의 모델에 복수의 대응

 

주제객체를 위한 추상 타입 제공.

StatusChecker -> StatusSubject 추상클래스 존재

안드로이드 버튼 클래스 -> 상위타입 View 존재

모두 옵저버 객체를 관리하기 위한 기능 제공한다는 공통점 가짐

//StatusChecker 클래스

Public void add(StatusObserver observer){…}

//View클래스

Public void setOnClickListener(OnClickListener o){….}

 

 

주제에 대한 다양한 구현 클래스가 존재한다면

옵저버 객체 관리/통지 기능을 제공하는 추상클래스를 제공 ~

불필요하게 동일한 코드가 여러 주제 클래스에서 중복되는 것을 방지

(해당 주제 클래스가 한개뿐이라면 옵저버 관리 위한 추상클래스 불필요)

 

고려사항

  • 주제 객체의 통지 기능 실행 주체
  • 옵저버 인터페이스 분리
  • 통지 시점에서의 주제객체 상태
  • 옵저버 객체의 실행 제약조건

 

 

Java.util.Observer인터페이스

Java.util.observable 클래스

Observer패턴의 일종이지만 사용하기 힘듦

Observer인터페이스에서 전달하는 subject역할에 observable클래스를 사용해야함

자바는 단일 상속 ~ 이미 무언가의 하위클래스라면 사용 불가

 

Cf ) Mediator 패턴




Comments