sitelink1 http://blog.naver.com/gamediz/20042711858 
sitelink2  
sitelink3  
extra_vars4  
extra_vars5  
extra_vars6  

1. 책임연쇄(Chain of Responsibility)

1)    정의

요청을 처리할 수 있는 기회를 하나 이상의 객체에게 부여함으로써 요청하는 객체와 처리하는 객체 사이의 결합도를 없애려는 것이다. 요청을 해결할 객체를 만날 때까지 객체 고리를 따라서 요청을 전달한다.

 

책임연쇄 패턴은 두 객체간의 결합도를 낮추기 위한 패턴이다.

결합도는 두 개의 객체가 연결되어 있는 정도를 나타낸다.

 

npec_gamediz.jpg

다음과 같이 A, B, C라는 객체가 있다.

A B와 그림과 같이 결합도가 높게 되어 있으면, B를 없애고 새로운 객체인 C와 결합을 시키려고 할 때 분리에 대한 노력도 많이 들고, C를 붙이기 위한 노력도 많이 들게 된다.

이렇기 때문에 결합도를 낮춰서 노력을 적게 들일 수 있는 방법을 연구하게 되었고 그에 따라 책임연쇄 패턴이 생겨났다고 할 수 있다.

 

2)    예제

책임연쇄 패턴은 현실로 비교하면 이런 것과도 비교할 수 있다.

진용씨 UI부분 진용씨가 맡고 계시죠?

아니오 UI부분은 김태희씨가 맡고 있는데요….

김태희씨 UI부분에서 파티 시스템 관련해서 물어볼 께 있는데요?

음 파티 시스템 부분은 전지현씨가 맡고 계세요……

(그렇다사실 책임연쇄 패턴의 실체는 내가 맡은 책임이 아니라고 발뺌하면서 책임자를 연결해주는 그런 패턴이였던 것이다 -_-; )

 

 3)    게임에서의 활용

게임의 UI 부분에서 책임연쇄 패턴을 사용한 부분을 찾을 수 있는데

가장 대표적인 예가 툴팁이나 도움말 기능을 띄울 때 볼 수 있다.

 

 npee_gamediz.jpg

 

위의 표 10을 보자

10에는 버튼, 서브창, 메인창이라는 3가지의 객체가 존재하는 것을 볼 수 있다.

창위에 마우스 커서를 올려놓은 후에 F1을 누르면 도움말이 뜨는 기능이 구현되어 있다고 했을 때 어떤 식으로 구현이 될까?

 

먼저 버튼 위에 마우스 커서를 올려놓고 F1을 누르면 버튼에 대한 도움말이 나와야 한다.

그런데 만약 버튼이 도움말을 가지고 있지 않다면? 어떻게 처리해야 할까? 도움말을 출력하지 말아야 할까?

그렇게 될 경우에 매우 어색하기 때문에 버튼보다 상위 개념인 서브창의 도움말을 출력하도록 한다. 만약 서브창 조차 도움말을 가지고 있지 않다면 그 보다 상위 개념인 메인창 부분의 도움말을 출력해준다.

 

이 처럼 명령은 분명 버튼이라는 객체에 내렸는데 버튼은 서브창에 책임을 넘기고 서브창은 메인창에 책임을 넘기는 것, 이러한 구조가 될 수 있도록 하는 것이 바로 책임연쇄 패턴이라고 할 수 있다.

 

구조상으로는 버튼, 서브창, 메인창은 같은 인터페이스를 상속받아서 공유를 하는 것이며 최초 설계할 때부터 책임을 넘겨줄 대상을 가지고 있게 된다.

(ex : 버튼 a 서브창 a 메인창)