상세 컨텐츠

본문 제목

Mediator Pattern 배워보기

Java

by techbard 2014. 1. 22. 14:39

본문

반응형

중재라 패턴이라 불리며 각 객체간에 교통정리를 Mediator가 해주는 패턴이다. 옵서버 패턴과 유사해 보이나 다른 점은 처리 로직이 Mediator에 들어있다는 점이고, 옵서버 패턴들은 Observable이 이벤트를 Observer에게 보내면 Observer가 그 이벤트에 따라 처리로직을 실행하는 점이 다르다고 한다.

 

전체적인 시나리오를 먼저 구상해야 하는데 방을 할당해 주는 RoomManager가 있고 Room이 3개 있다. 손님 10명이 와서 방을 요청하는데 빈방이 있으면 할당받지만 빈방이 없다면 대기해야 한다. 방을 할당받은 손님은 방을 사용하고 있는지를 매니저에게 알려주고, 방 사용이 끝나면 매니저에게 다시 알려준다.

 

이것을 구현해 보자.

 

1. Mediator 역할을 하는 클래스의 인터페이스를 작성한다.

 

 

Mediator 클래스의 메소드들은 다음과 같다.

 

a. getRoom() - 빈방이 있는지 여부를 매니저가 확인해서 요청한 손님에게 알려준다.

b. useRoom() - 손님이 방을 사용하고 있다고 매니저에게 알릴때 사용한다.

c. releaseRoom() - 손님이 방을 사용한 후 키를 매니저에게 맡기며 방을 비울때 사용한다.

 

2. 세부 Mediator 클래스를 작성한다.

 

 

 

이 클래스를 설명하자면

 

a. Vector 자료구조를 사용했는데 ArrayList는 Thread-Safe하지 않은 클래스라고 해서 Thread-Safe한 Vector를 사용한다.

 

b. getRoom() - Vector 구조를 생성할 때 크기를 방 크기로 가정하고 그 크기 이상이라면 방이 모두 찬것으로 가정하고 boolean 값을 리턴해 방요청을 하지 않도록 한다.

 

c. useRoom() - Vector 구조안에 자신 객체가 들어 있는지 확인해서 없으면 추가한다.

 

d. releaseRoom() - Vector 구조안에 자신 객체가 들어 있는지 확인해서 있으면 제거한다.

 

3. Mediator 패턴에서의 colleague 클래스를 작성한다.

 

 

 

여러 개의 동료를 생성해서 모두 접근 시도하도록 하기 위해서 Runnable 인터페이스를 구현한다.

 

a. getManOfSeq() - 객체 내부의 멤버에 저장된 객체번호 (= 사람 id)를 리턴한다. 이 값은 매니저가 사용한다.

 

b. run() - 매니저 객체의 getRoom() 메소드를 호출해서 넘어오는 boolean 값에 따라 계속 요청을 할 것인지 방 사용을 시작할 것인지 판단한다. 이후 방을 사용할 수 있다는 허가가 나면, 매니저 클래스의 useRoom(this) 방식으로 호출해서 매니저에게 자기 자신 객체를 던진다. 그러면 매니저에서는 본인이 가진 Vector 자료 구조와 받은 Person 객체의 멤버 변수를 읽어 처리한다. releaseRoom(this) 메소드도 같은 방식으로 매니저에게 방 사용이 끝났음을 알린다.

 

4. 테스트 클래스로 확인해 보자.

 

 

방이 3개이며 Person이 10인 결과:

 

0: 방을 사용하는중...
2: 방을 사용하는중...
1: 방을 사용하는중...
3: 방을 사용하는중...
4: 방을 사용하는중...
5: 대기하는중...
7: 대기하는중...
6: 대기하는중...
8: 대기하는중...
9: 대기하는중...
0: 키를 반납했다.
4: 키를 반납했다.
3: 키를 반납했다.
2: 키를 반납했다.
1: 키를 반납했다.
7: 방을 사용하는중...
5: 방을 사용하는중...
8: 방을 사용하는중...
9: 방을 사용하는중...
6: 방을 사용하는중...
7: 키를 반납했다.
8: 키를 반납했다.
9: 키를 반납했다.
6: 키를 반납했다.
5: 키를 반납했다.
==========
모든 방이 비었다.
걸린시간: 2002ms

 

방이 7개이며 Person이 10인 결과:

 

0: 방을 사용하는중...
1: 방을 사용하는중...
3: 방을 사용하는중...
4: 방을 사용하는중...
2: 방을 사용하는중...
6: 방을 사용하는중...
7: 방을 사용하는중...
5: 방을 사용하는중...
8: 방을 사용하는중...
9: 대기하는중...
5: 키를 반납했다.
7: 키를 반납했다.
6: 키를 반납했다.
3: 키를 반납했다.
0: 키를 반납했다.
4: 키를 반납했다.
1: 키를 반납했다.
2: 키를 반납했다.
8: 키를 반납했다.
9: 방을 사용하는중...
9: 키를 반납했다.
==========
모든 방이 비었다.
걸린시간: 2001ms

 

방이 많을 수록 대기자는 주는 것을 알 수 있다. 결과로는 보이지 않았지만 방을 9개로 세팅하면 걸린시간은 1001ms 임을 알 수 있다.

 

MediatorPattern.zip

 

*** maxRoom 값 비교가 잘못되어서 방 크기 이상을 사용하고 있었다.

if (vector.size() >= maxRoom) {

로 수정되어야 한다.

 

반응형

관련글 더보기

댓글 영역