정의
- 명령 객체와 일련의 처리 객체를 포함하는 디자인 패턴이다. 각각의 처리 객체는 명령 객체를 처리할 수 있는 연산의 집합이고, 체인 안의 처리 객체가 핸들할 수 없는 명령은 다음 처리 객체로 넘겨진다.
- 이 작동방식은 새로운 처리 객체부터 체인의 끝까지 다시 반복된다.
쉽게 설명하면
- 어떤 요청이 그 요청을 담당하는 객체에 들어오면 각각의 요청에 대해서 특정한 객체가 담당하는 것이 일반적이지만 객체를 연결리스트와 같은 사슬 방식으로 연결한 후에 요청을 수행하지 못하는 객체라면 다음 객체에 넘기며 책임을 넘기는 형태의 패턴을 말한다.
목적
- 이 패턴은 결합을 느슨하게 하기 위해 고안되었으며 가장 좋은 프로그래밍 사례로 꼽힌다. 요청을 보내는 객체와 이를 처리하는 객체간의 결합도를 느슨하게 하기 위한 방법이며 여러 객체에 처리 기회를 준다.
- 책임연쇄 패턴 장점
- 결합도를 낮추며, 요청의 발신자와 수신자를 분리시킬 수 있다.
- 클라이언트는 처리객체의 집합 내부의 구조를 알 필요가 없다.
- 집합 내의 처리 순서를 변경하거나 처리객체를 추가 또는 삭제할 수 있어 유연성이 향상된다.
- 새로운 요청에 대한 처리객체 생성이 매우 편리하다.
- 책임연쇄 패턴 단점
- 충분한 디버깅을 거치지 않았을 경우 집합 내부에서 사이클이 발생할 수 있다.
- 디버깅 및 테스트가 쉽지 않다.
- 책임연쇄 패턴 구조
- Handler
요청을 수신하고 처리객체들의 집합에 전달하는 인터페이스이다.
집합의 첫 번째 핸들러에 대한 정보만 가지고 있으며 그 이후의 핸들러에 대해서는 알 수 없다. - Concrete Handler
요청을 처리하는 실제 처리객체입니다. - Client
요청을 전달하는 클라이언트입니다.
- 예제 코드
가장 대표적인 연쇄 책임 패턴의 예는 Java 에서의 try catch 문의 있다.
try {
...
} catch (IllegalArgumentException e) {
someCode();
} catch (SecurityException e) {
someCode();
} catch (IllegalAccessException e) {
someCode();
} catch (NoSuchFieldException e) {
someCode();
} finally {
...
}
- 동전을 거슬러주는 프로그램을 만든다고 해보자.
- 그리고 동전은 100원, 10원, 1원 으로만 거슬러줄수 있다고 가정해보자.
- 이경우는 100원 -> 10원 -> 1원으로 넘겨주는 방식으로 연쇄책임패턴을 구현할수있다.
Currency.java : PJO 선언
package com.patterns.ChainofResponsibility;
public class Currency {
private int amount;
public Currency(int amt) {
this.amount = amt;
}
public int getAmount() {
return this.amount;
}
}
DispenseChain.java : 인터페이스로 선언
package com.patterns.ChainofResponsibility;
public interface DispenseChain {
void setNextChain(DispenseChain nextChain); //다음체인 넘겨줌
void dispense(Currency cur); //분배
}
Won100Dispenser.java
package com.patterns.ChainofResponsibility;
public class Won100Dispenser implements DispenseChain {
private DispenseChain chain;
@Override
public void setNextChain(DispenseChain nextChain) {
this.chain = nextChain;
}
@Override
public void dispense(Currency cur) {
if (cur.getAmount() >= 100) {
int num = cur.getAmount() / 100;
int remainder = cur.getAmount() % 100;
System.out.println("Dispensing " + num + " 100₩ note");
if (remainder != 0)
this.chain.dispense(new Currency(remainder));
} else
this.chain.dispense(cur);
}
}
Won10Dispenser.java
package com.patterns.ChainofResponsibility;
public class Won10Dispenser implements DispenseChain {
private DispenseChain chain;
@Override
public void setNextChain(DispenseChain nextChain) {
this.chain=nextChain;
}
@Override
public void dispense(Currency cur) {
if(cur.getAmount()>=10){
int num=cur.getAmount()/10;
int remainder=cur.getAmount()%10;
System.out.println("Dispensing " +num+" 10₩ note");
if(remainder!=0) this.chain.dispense(new Currency(remainder));
}
else this.chain.dispense(cur);
}
}
Won1Dispenser.java
package com.patterns.ChainofResponsibility;
public class Won1Dispenser implements DispenseChain {
private DispenseChain chain;
@Override
public void setNextChain(DispenseChain nextChain) {
this.chain = nextChain;
}
@Override
public void dispense(Currency cur) {
int num = cur.getAmount() / 1;
System.out.println("Dispensing " + num + " 1₩ note");
}
}
즉 분배체인 인터페이스(DispenseChain) 통해 Won100Dispenser - > Won10Dispenser -> Won1Dispenser로 넘김
테스트
package com.patterns.ChainofResponsibility;
public class ChainTest {
private DispenseChain c1;
public ChainTest(){
this.c1=new Won100Dispenser();
DispenseChain c2=new Won10Dispenser();
DispenseChain c3=new Won1Dispenser();
c1.setNextChain(c2);
c2.setNextChain(c3);
}
public static void main(String[] args) {
ChainTest atmDispenser = new ChainTest();
atmDispenser.c1.dispense(new Currency(378));
}
}
참고원문 : https://k0102575.github.io/articles/2020-02/chain-of-responsibility-pattern
책임 연쇄 패턴(chain-of-responsibility pattern)
연쇄책임패턴 (Chain-of-responsibility pattern)
k0102575.github.io
'IT > 다자인 패턴' 카테고리의 다른 글
3.9 비지터 패턴(Vistor Pattern) .....행동 패턴(Behavioral Pattern) 중 (0) | 2022.08.14 |
---|---|
3.8 메멘토 패턴 (Memento Pattern) .....행동 패턴(Behavioral Pattern) 중 (0) | 2022.08.14 |
3.6 상태(State) .....행동 패턴(Behavioral Pattern) 중 (0) | 2022.08.14 |
3.5 전략 패턴(Stragety Pattern).....행동 패턴(Behavioral Pattern) 중 (0) | 2022.08.13 |
3.4 중재자 패턴(Mediator Pattern).....행동 패턴(Behavioral Pattern) 중 (0) | 2022.08.13 |