Java로 배우는 디자인패턴 입문 Chapter 17. Observer 패턴 상태의 변화를 통지한다

Slides:



Advertisements
Similar presentations
3. 메소드와 변수 SCJP 자격증 프로젝트 발표자 : 최선웅. 1. 메 소 드 개 념 2. 메 소 드 양 식 3. 메 소 드 변 수 4. 메 소 드 예 제 5. 참 고 문 헌 / 자 료 목 차.
Advertisements

6 장. printf 와 scanf 함수에 대한 고찰 printf 함수 이야기 printf 는 문자열을 출력하는 함수이다. – 예제 printf1.c 참조 printf 는 특수 문자 출력이 가능하다. 특수 문자의 미 \a 경고음 소리 발생 \b 백스페이스 (backspace)
Java 로 배우는 디자인패턴 입문 Chapter 15. Facade 간단한 창구 덕성여자대학교 컴퓨터학부.
목 차 C# 언어 특징 .NET 프레임워크 C# 콘솔 프로그램 C# 윈도우 프로그램 실습 프로그래밍세미나 2.
클래스 class, 객체 object 생성자 constructor 접근 access 제어 이벤트 event 처리.
Power Java 제3장 이클립스 사용하기.
최윤정 Java 프로그래밍 클래스 상속 최윤정
Java로 배우는 디자인패턴 입문 Chapter 22. Command 명령을 클래스로 만든다
Java로 배우는 디자인패턴 입문 Chapter 5. Singleton 단 하나의 인스턴스
Report #2 - Solution 문제 #1: 다음과 같이 프로그램을 작성하라.
JAVA 언어로 배우는 디자인 패턴 입문 chap. 1-2.
제 6장. 생성자와 소멸자 학기 프로그래밍언어및실습 (C++).
8.1 인터페이스 개요와 인터페이스 정의 8.2 인터페이스의 사용 8.3 인터페이스의 상속 8.4 인터페이스 참조
Memento Something writing to Memento Card, keep it in a drawer. When you need to recall it, open drawer and take it back 발표자 김지원.
Lesson 6. 형변환.
Chap08 다중 스레드 8.1 스레드 개요 8.2 Thread 클래스와 스레드 생명주기 8.3 스레드 생성과 사용
SqlParameter 클래스 선문 비트 18기 발표자 : 박성한.
자바 5.0 프로그래밍.
Java로 배우는 디자인패턴 입문 Chapter 12. Decorator 장식과 내용물의 동일시
Power Java 제14장 배치 관리자.
6장. printf와 scanf 함수에 대한 고찰
2007 1학기 11 프로젝트 기초 실습.
자바네트워크 제2주 실습 네트워크기초, 스레드.
자바 5.0 프로그래밍.
13. 연산자 오버로딩.
7장 인터페이스와 추상 클래스.
Method & library.
JA A V W. 03.
사용자 함수 사용하기 함수 함수 정의 프로그램에서 특정한 기능을 수행하도록 만든 하나의 단위 작업
자바 5.0 프로그래밍.
인터넷응용프로그래밍 JavaScript(Intro).
CHAP 13. 방명록 만들기 실습.
WIN95,98 보조프로그램 ‘그림판’을 이용한 포장지디자인.
Java의 정석 제 5 장 배 열 Java 정석 남궁성 강의 의
HTTP 프로토콜의 요청과 응답 동작을 이해한다. 서블릿 및 JSP 를 알아보고 역할을 이해한다.
Lesson 2. 기본 데이터형.
Term Projects 다음에 주어진 2개중에서 한 개를 선택하여 문제를 해결하시오. 기한: 중간 보고서: 5/30 (5)
Chapter6 : JVM과 메모리 6.1 JVM의 구조와 메모리 모델 6.2 프로그램 실행과 메모리 6.3 객체생성과 메모리
Effective Java [Issue 1 and 2]
27강 JAVA Collections - II - Map계열 컬렉션 클래스 살펴보기 - Set계열 컬렉션 클래스 살펴보기
15장 컬렉션 프레임워크 Section 1 컬렉션 프레임워크의 개요 Section 2 리스트 Section 3 셋
웹디자인
Part 4 클래스 라이브러리 Chapter 10 : 다중 스레드 Chapter 11 : 패키지와 주요 클래스
자바 5.0 프로그래밍.
Power Java 제11장 상속.
보고서 #7 (기한: 6/2) 2개의 스택, stk1, stk2를 이용하여 큐를 구현하라.
15강. 폼 데이터 값 검증 Validator를 이용한 검증 ValidationUtils 클래스
JA A V W. 06.
컴퓨터 프로그래밍 기초 [01] Visual Studio 설치 및 사용방법
컴퓨터 계측 및 실습 디지털 출력 영남대학교 기계공학부.
12. 상속 : 고급.
객체기반 SW설계 팀활동지 4.
18강. 인터페이스 – II - 인터페이스와 다중상속 - 인터페이스를 통한 로봇 장남감 만들기 프로그래밍
4장. 데이터 표현 방식의 이해. 4장. 데이터 표현 방식의 이해 4-1 컴퓨터의 데이터 표현 진법에 대한 이해 n 진수 표현 방식 : n개의 문자를 이용해서 데이터를 표현 그림 4-1.
클래스 : 기능 CHAPTER 7 Section 1 생성자(Constructor)
Homework #12 (1/2) 프로그램을 작성하고, 프로그램과 실행 결과를 프린트하여 제출한다.
컴퓨터 구성요소와 사용 컴퓨터 문서 작업 인터넷 활용
중복 멤버의 처리 조 병 규 한 국 교 통 대 학 교 SQ Lab..
제 8장. 클래스의 활용 학기 프로그래밍언어및실습 (C++).
안드로이드 앱 개발과정 Step1. 기초과정 강사 : 정 훈 희.
학습내용 프로토콜 계층화 OSI 모델의 용어 및 기능 개체 서비스 접근점 (N) 프로토콜과 (N) 서비스 서비스 프리미티브
MIDP 네트워크 프로그래밍 ps lab 김윤경.
발표자 : 이지연 Programming Systems Lab.
Android -Data Base 윤수진 GyeongSang Univ. IT 1.
.Net FrameWork for Web2.0 한석수
2.가상머신의 탐험 도구, Oolong에 대하여 ps lab 김윤경.
Power Java 제14장 배치 관리자.
프로젝트 결과 발표 네트워크정보통신과 강동성 이현미.
7 생성자 함수.
6 객체.
Presentation transcript:

Java로 배우는 디자인패턴 입문 Chapter 17. Observer 패턴 상태의 변화를 통지한다 2004-1 덕성여자대학교 컴퓨터학부

observer 01. Observer 패턴 관찰자 관찰 대상의 상태가 변하면, 관찰자에게 통지된다. 객체의 상태 변화에 따른 처리를 기술할 때 유용하게 사용된다. /42

수를 많이 생성하는 객체를 관찰자가 관찰해서, 그 값을 표시하는 프로그램 관찰자의 종류에 따라 표시 방법이 다르다 02. 예제 프로그램 수를 많이 생성하는 객체를 관찰자가 관찰해서, 그 값을 표시하는 프로그램 관찰자의 종류에 따라 표시 방법이 다르다 DigitObserver: 값을 숫자로 표시함 GraphObserver: 값을 간이 그래프로 표시함 /42

02. 예제 프로그램 /42

02. 예제 프로그램 클래스 다이어그램 관찰자 관찰대상 /42

Observer 인터페이스 02. 예제 프로그램 관찰자를 표현하는 인터페이스 update(NumberGenerator) /42

NumberGenerator 클래스 02. 예제 프로그램 수를 생성하는 클래스 execute( ), getNumber( ): 추상 메소드 observer 필드: NumberGenerator를 관찰하고 있는 Observer들을 보관하고 있는 필드 addObserver(Observer) Observer를 추가할 때 호출하는 메소드 deleteObserver(Observer) Observer를 삭제할 때 호출하는 메소드 notifyObservers( ) Observer 전원에게, “나의 내용이 갱신되었기 때문에 당신의 표시도 갱신해주세요”라고 알려주는 메소드 Observer들의 update(this) 메소드를 차례차례 호출한다. /42

RandomNumberGenerator 클래스 02. 예제 프로그램 RandomNumberGenerator 클래스 NumberGenerator의 하위 클래스 난수를 생성한다 java.util.Random 클래스 이용 number 필드: 생성된 난수를 저장하는 변수 getNumber( ): number 필드의 값을 반환함 execute( ): 0~49 까지의 난수 20개를 생성하고, 그 때마다 notifyObservers를 호출하여, 관찰자들에게 통지한다. Random 클래스의 nextInt( ) 이용함 /42

DigitObserver 클래스 02. 예제 프로그램 Observer 인터페이스를 구현한 구체적인 관찰자 관찰한 수를 ‘숫자’로 표시함 update(NumberGenerator) 인자로 전달된 NumberGenerator의 getNmber( )를 이용하여 수를 얻어서 화면에 출력한다. 출력한 후, 표시된 모습을 잘 알 수 있도록 Thread.sleep( )을 이용하여 스피드를 늦춘다. Thread.sleep(100) (100/1000 = 0.1 초) 동안 CPU를 반환하고 쉬겠다는 뜻 /42

GraphObserver 클래스 02. 예제 프로그램 Observer 인터페이스를 구현한 구체적인 관찰자 관찰한 수를 ‘간단한 그래프’로 표시함 관찰한 숫자만큼의 ‘*’를 출력한다 /42

Main 클래스 02. 예제 프로그램 RandomNumberGenerator 인스턴스 1 개 생성함 관찰자 2개 생성함 RandomNumberGenerator의 execute( )를 이용해서 수를 생성한다 난수가 발생될 때마다, 관찰자들은 각자의 방식대로 수를 ‘표시’한다. /42

ConcreteSubject(구체적인 관찰대상자) 역할 03. 등장 역할 Subject(관찰 대상자) 역할 ‘관찰되는 쪽’을 나타냄 Observer 역할을 등록하는 메소드와 삭제하는 메소드를 가진다. 현재의 상태를 얻어갈 때 호출하는 메소드도 제공함 예제에서는, NumberGenerator 인터페이스가 해당됨 ConcreteSubject(구체적인 관찰대상자) 역할 구체적인 ‘관찰되는 쪽’을 나타냄 상태가 변하면, 등록된 Observer 역할에게 통보함 예제에서는, RandomNumberGenerator 클래스가 해당됨 /42

ConcreteObserver(구체적인 관찰자) 역할 03. 등장 역할 Observer(관찰자) 역할 ‘관찰하는 쪽’을 나타냄 Subject 역할로부터 상태변화를 통보받는 역할 예제에서는, Observer 인터페이스가 해당됨 통보받을 때, 관찰자의 update( ) 메소드가 호출됨 ConcreteObserver(구체적인 관찰자) 역할 구체적인 ‘관찰하는 쪽’을 나타냄 상태 변화가 관찰 대상으로부터 통보되면(즉, update 메소드가 호출되면) 그 메소드안에서 Subject 역할의 현재 상태를 얻어서 적당한 일을 수행한다. 예제에서는, DigitObserver와 GraphObserver 클래스가 해당됨 /42

03. 등장 역할 /42

여기서도 교환 가능성이 등장한다. 04. 독자의 사고를 넓혀주는 힌트 RandomNumberGenerator 클래스는, 현재 자신을 관찰하고 있는 것이 DigitObserver의 인스턴스인지 GraphObserver의 인스턴스인지 모른다. 다만, 이들이 Observer 인터페이스를 구현하고 있다는 것만 안다. 한편, DigitObserver 클래스는, 자신이 관찰하고 있는 것이 RandomNumberGenerator의 인스턴스인지 다른 XXXXXNumberGenerator의 인스턴스인지 신경쓰지 않는다. 다만, 관찰대상이 NumberGenerator의 하위 클래스의 인스턴스이고 getNumber 메소드를 가지고 있다는 것만 알고 있다. 관찰자와 관찰 대상을 논리적으로 분리함으로써, 각각을 쉽게 교체할 수 있다 => 확장성/교환 가능성이 높아진다. /42

04. 독자의 사고를 넓혀주는 힌트 갱신을 위한 정보의 취급 NumberGenerator는 update 메소드를 사용해서 ‘갱신되었습니다’라고 Observer에게 통지한다. 이때, Observer 클래스의 update( )의 입력인자는 NumberGenerator 이다. Observer는 입력인자로 들어온 NumberGenerator를 이용하여 원하는 정보를 추출한다. NumberGenerator가, 관찰자가 필요한 정보만 넘겨줄 수도 있다. void update(NumberGenerator generator){ ... ... //generator.getNumber() 이용 } void update(int number){ ... ... //number 이용 } subject(관찰대상)이, 관찰자가 필요한 정보가 무엇인지 알아야 하는 부담을 가지고 있다. /42

‘관찰’하는 것이 아니고, 사실은 ‘통지’를 받는다. 04. 독자의 사고를 넓혀주는 힌트 ‘관찰’하는 것이 아니고, 사실은 ‘통지’를 받는다. Observer의 역할이, 사실은 Subject로부터 통지가 오기를 기다리는, 수동적인 역할을 하고 있다. 그래서, Observer 패턴을 Publish-Subscribe 패턴이라고도 한다. /42

Model/View/Controller(MVC) 04. 독자의 사고를 넓혀주는 힌트 Model/View/Controller(MVC) Smalltalk 언어에서, 하나의 데이터 모델을 여러 형태로 보여 주고자 할 때 사용되는 유명한 패턴이다. Model과 View의 관계는, Observer 패턴에서 Subject와 Observer의 역할과 서로 대응된다. /42

java.util.Observer 인터페이스 05. 보강 JDK에서 제공되는 java.util.Observer 인터페이스와 java.util.Observable 클래스는, Observer 패턴의 일종이다. java.util.Observer 인터페이스 java.util.Observer와 java.util.Observable를 사용하기가 쉽지 않다. 관찰대상이 되는 클래스를 정의하기 위해서는 java.util.Observable 클래스를 상속받아야 한다. 그런데, 이미 Subject 역할로 생각하고 있는 클래스가 다른 클래스의 하위 클래스이면, Observable 클래스를 또 상속 받을 수가 없다. (왜냐하면, 다중 상속을 자바는 지원하지 않으므로) 따라서, 사용하기가 쉽지 않다. public void update(Observable obj, Object arg) 부가 정보 관찰되는 대상 /42

06. 관련 패턴 Mediator 패턴 /42

객체의 상태변화를 다른 객체에게 통지하는 Observer 패턴 07. 요약 객체의 상태변화를 다른 객체에게 통지하는 Observer 패턴 /42

17-1 연습 문제 예제 프로그램에, 관찰대상으로서의 IncrementalNumberGenerator 클래스를 추가하기 시작하는 수와 마지막 수 및 증가분을 입력받는 생성자를 가진다. 예: new IncrementalNumberGenerator(10, 50, 5) 인 경우 10부터 50까지 5씩 증가하면서 숫자 생성 (10, 15, 20, ...) 숫자가 만들어질 때 마다 관찰자에게 통지한다. /42

17-2 연습 문제 startAngle 90 -number*360/50 (arcAngle) 예제 프로그램에 관찰자 3개를 17-2 예제 프로그램에 관찰자 3개를 추가함 FrameObserver BorderLayout 매니저: 프레임 영역을 동서남북중앙으로 나눔 update( ): GraphText와 GraphCanvas의 update( )를 호출함 GraphText 숫자만큼의 ‘*’를 출력하는 관찰자 GraphCanvas Graphics 객체의 fillArc(int x, int y, int width, int height, int startAngle, int arcAngle) startAngle 부터 arcAngle 만큼 그린다 startAngle: 0 이면 3시 위치를 의미한다. (반시계방향으로 증가) arcAngle: 양수이면 반시계 방향으로 그리고, 음수이면 시계방향으로 그린다 /42

Homework #4: Observer 패턴 응용 예제 프로그램에 관찰자 및 관찰 대상 추가하기 관찰자 클래스: NamePrintObserver 관찰 대상자로부터 통지가 올 때 마다, 관찰 대상자로부터 숫자를 얻어 그 숫자만큼의 자기 이름을 새로운 한 줄에 계속해서 출력한다. 예: 관찰대상자로부터 얻은 숫자가 5 인 경우 출력: 최승훈 최승훈 최승훈 최승훈 최승훈 관찰대상 클래스: PrimeNumberGenerator NumberGenerator의 하위 클래스로 둔다 1부터 50 사이의 소수(prime number)를 생성한다 생성할 때 마다 등록된 관찰자들에게 통지한다. Main 클래스의 main( ) PrimeNumberGenerator 의 인스턴스인 png를 생성한다. DigitObserver와 GraphObserver 이외에 NamePrintObserver의 인스턴스를 생성한다. png에 위의 3가지 Observer를 등록한다. png.execute( )를 실행한다. 숙제 제출 방법: 이전 것과 똑같은 방법으로 제출함 /42