상세 컨텐츠

본문 제목

Observer Pattern #2 배워보기

Java

by techbard 2014. 1. 21. 16:35

본문

반응형

Java 내장 클래스를 이용한 Observer 패턴은 제약이 있기 때문에 직접 구현한 옵서버 패턴이다.

 

객체를 던져서 그 객체에 있는 메소드를 통해 값을 받고 그 값이 원하는 것이면 반응하도록 리시버 클래스를 작성한다.

 

1. 리시버 클래스를 다룰 수 있는 인터페이스를 작성한다.

 

 

특별한 것은 없다. 이후 만들 Catcher1, Catcher2 클래스를 다룰 수 있는 공통 인터페이스를 정의할 뿐이다. 다만, 메소드의 인자로 Speaker 클래스 타입을 다루어야 한다고 명시한다.

 

2. 이 인터페이스를 구현하는 Catcher (= Observer) 클래스들을 구현한다.

 

 

 

아직 Speaker 클래스가 뭔지는 모르지만

 

a. Speaker 클래스는 getNumber() 메소드를 제공한다. 이 메소드는 int 형을 반환한다.

 

b. ICatcher 인터페이스를 구현했으므로 ICatcher 타입으로 다룰 수 있다.

 

즉, Speaker 객체를 받아 getNumber를 통해 받은 int형 데이터가 짝수인지 홀수인지에 따라 각각 다르게 동작한다.

 

3. Speaker (= Observable) 클래스를 작성한다.

 

 

먼저 멤버로 ICatcher 인터페이스를 다룰 수 있는 ArrayList를 선언한다. 그리고 랜덤 정수를 리턴하기 위한 변수도 선언한다.

 

생성자에서 인자로 랜덤으로 생성할 최대치 값을 받아 멤버에 저장한다.

 

전체 Catcher 클래스 객체들을 목록으로 만들 메소드를 작성한다. addCatcher() 메소드가 그것으로 ICatcher 타입의 객체를 받아 목록을 만든다.

 

notifyCatchers() 메소드에서는 이렇게 만든 목록에서 이터레이터를 얻어 목록 내의 모든 요소에 대해 update 메소드를 호출하면서 자기 자신 (Speaker)을 던진다. 이후 Catcher1, 2 클래스 내부의 update 메소드는 Speaker 객체를 통해 getNumber를 얻게 되고 이 정수값을 전달받게 된다.

 

4. 이제 테스트 클래스를 작성해 보자.

 

 

4번 라인에서 Speaker 객체를 생성하면서 10이하의 정수만 생성하도록 한다.

5-6번 라인에서 Catcher 객체를 생성한다.

8-9번 라인에서 Speaker 객체에 Catcher 객체를 추가한다.

 

이제 notifyCatchers() 메소드를 호출하면 추가된 객체 전체에 대해서 update 메소드를 호출하면서 인자로 Speaker 객체 자신을 던진다.

 

결과1:

[6] It's even.
[4] It's even.
[2] It's even.
[6] It's even.
[5] It's odd.
[6] It's even.
[6] It's even.
[3] It's odd.
[0] It's even.
[1] It's odd.

 

결과2:

[5] It's odd.
[4] It's even.
[8] It's even.
[5] It's odd.
[6] It's even.
[1] It's odd.
[1] It's odd.
[8] It's even.
[9] It's odd.
[2] It's even.
[4] It's even.
[9] It's odd.
 

ObserverPattern2.zip

 

반응형

관련글 더보기

댓글 영역