일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- 디자인패턴
- 생성패턴
- bfs
- AbstractFactory
- 완전탐색
- 재귀
- C언어
- 이터레이터
- C
- 알고리즘
- problemsolving
- 데코레이터패턴
- 백준
- 행위패턴
- ps
- 구조패턴
- 반복자
- 빌더패턴
- 팩토리메소드
- FactoryMethod
- c++
- 회전하는큐
- 14500
- UML
- 추상팩토리
- 테트로미노
- 클래스다이어그램
- 다이어그램
- 어댑터패턴
- 옵저버
- Today
- Total
salsa source
[디자인패턴] Observer패턴 본문
<출처 : 개발자가 반드시 정복해야 할 객체지향과 디자인 패턴>
실제 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 패턴
'STUDY > 디자인패턴' 카테고리의 다른 글
[디자인패턴]클래스다이어그램(3) 구조패턴 - 데코레이터, 어댑터 (0) | 2018.04.02 |
---|---|
[디자인패턴]클래스다이어그램(2) 행위패턴 - 반복자, 관찰자, 전략 (0) | 2018.04.02 |
[디자인패턴]클래스다이어그램(1) 생성패턴 - 빌더, 추상팩토리, 팩토리메소드, 싱글톤 (0) | 2018.04.02 |
[디자인패턴]소개 및 Iterator 패턴 (0) | 2018.02.07 |