[디자인패턴] 책임사슬패턴(Chain of Responsibility pattern)

2016. 11. 24. 13:17프로그래밍/디자인패턴

    목차

책임사슬패턴(Chain of Responsibility)


결합을 느슨하게 하기 위해 고안된 패턴

한 개의 요청에 대하여 여러 객체에게 처리할 수 있는 기회를 주도록 한 디자인패턴


  작성형식




  내용


책임사슬패턴은 어떤 하나의 문제가 발생했을 경우 그 문제를 처리를 담당하는 다수의 처리기를 두고 순서대로 처리를 해 나가는 것이라고 보면 된다. 자바에서 책임사슬패턴을 찾아 보면 try - catch - finally 가 해당된다. try 블럭 안에서 코드를 실행 중에 Exception이 발생하게 되면 catch 블럭으로 이동을 하게 되는데 발생한 Exception이 무엇이냐 따라서 어느 catch 블럭이 실행 되는지 결정이 되는데 이 과정이 책임사슬패턴을 이용한 구현 방식 중 하나이다.


catch 블럭에서 자신이 처리가 불가하다면 그 다음 catch 블럭으로 이동하여 체크하는 방식이 체인으로 연결된 형태로 보면 된다.


다른 예제와 코드를 통해서 책임사슬패턴에 대하여 알아 보도록 하자.

우리가 마트나 편의점 등에서 일하고 있는 사람이라 가정해 보자. 손님이 물건을 사고 현금을 내면 물건 값을 제외한 남은 거스름 돈을 줄 때 어떻게 계산을 해서 주면 되는가? 손님이 2,000원짜리 물건을 사고 5만원 짜리 지폐를 줬다면 우리는 남은 금액인 47,000원을 거슬러 주면 된다. 그럼 이때 저 47,000원 이라는 금액을 어떻게 줄 것인가? 모두 천원권 지폐로 줄 것인가? 오천원권 지폐와 천원권 지폐로 줄 것인가 아니면 만원권, 오천원권, 천원권을 모두 섞어 줄 것인가 하는 해결 방법들이 있다. 자. 방금 나열 했던 3가지 방식이 책임사슬패턴 처리 형식에 Handler들의 모임이라고 보면 된다. 각 지폐는 하나의 Handler가 되고 이 Handler들을 체인이 연결 된 것 처럼 연결해 나아가면 된다.

생각에 생각이 꼬리를 무는 것 처럼 거스름 돈을 계산할 때 47,000원을 손님에게 줘야된다면 일반 가장 큰 단위에 지폐부터 빼 나가면 될 것이다. 오만원권 부터 비교 및 계산을 하면 오만원 보다는 작은 값 이기에 거슬러줘야 할 돈이 없고 그 다음 단위인 만원권으로 확인 해 보니 4장을 거슬러줘야 된다. 그리고 남은 금액인 7000원은 다시 오천원권으로 비교 및 계산을 하니 1장이 필요하고 남은 2000원은 다시 천원권 지폐 2장이 필요하게 된다. 최종적으로 만원권 지폐 4장, 오천원권 지폐 1장, 천원권 지폐 2장이 필요하다는 계산이 끝난다.


//현금 클래스

//Handler 인터페이스

//현금을 계산하기 위한 Handler 구현 클래스



//테스트 코드


Handler 인터페이스를 구현한 Dollar50Dispenser, Dollar20Dispenser, Dollar10Dispenser 클래스들은 위에 예시를 들었던 거스름 돈을 주는 형식에 맞게 가장 큰 단위에 금액 부터 작은 단위로 체인 형식으로 setNextChain를 통해 연결 된 것을 볼 수 있다. 


  참조


http://www.journaldev.com/1617/chain-of-responsibility-design-pattern-in-java