책임 연쇄 패턴이란?
책임 연쇄 패턴은 클라이언트의 요청에 대한 처리를 하기 위해 여러 개의 처리 객체들로 나누고, 이들을 chain 마치 사슬처럼 연결해 집합 안에서 연쇄적으로 처리하도록 하는 패턴이다. 이러한 처리 객체들을 핸들러(handler)라고 부르는데, 요청을 받으면 각 핸들러는 요청을 처리할 수 있는지, 없으면 체인의 다음 핸들러로 처리에 대한 책임을 전가한다. 한마디로 책임 연쇄라는 말은 요청에 대한 책임을 다른 객체에 떠넘긴다는 소리이다.
책임 연쇄 패턴 사용법
- Handler : 요청을 수신하고 처리 객체들의 집합을 정의하는 인터페이스
- ConcreteHandler : 요청을 처리하는 실제 처리 객체
- 핸들러에 대한 필드를 내부에 가지고 있으며 메서드를 통해 다음 핸들러를 체인시키고 다음 바라본다.
- 자신이 처리할 수 없는 요구가 나오면 바라보고 있는 다음 체인의 핸들러에게 요청을 떠넘긴다.
- ConcreteHandler1 - ConcreteHandler2 - ConcreteHandler3 - ... 이런식으로 체인 형식이 구성되게 된다.
- Client : 요청을 Handler 전달한다
public interface Handler{
void setNextChain();
void operation();
}
public class ConcreteHandler1 implements Handler{
private Handler chain;
@Override
public void setNextChain(Handler nextChain){
this.chain=nextChain;
}
@Override
public void operation(){} //기능 구현
}
public class ConcreteHandler2 implements Handler{
private Handler chain;
@Override
public void setNextChain(Handler nextChain){
this.chain=nextChain;
}
@Override
public void operation(){} //기능 구현
}
public class Main{
public static void main(String[] args){
Handler handler1=new ConcreteHandler1();
Handler handler2=new ConcreteHandler2();
Handler handler3=new ConcreteHandler1();
handler1.setNext(handler2);
handler1.operation();
//요청에 대한 처리가 handler1의 operation-> handler2의 operation으로 순차적으로 적용
}
패턴 사용 시기
- 특정 요청을 2개 이상의 여러 객체에서 판별하고 처리해야 할때
- 특정 순서로 여러 핸들러를 실행해야 하는 경우
- 프로그램이 다양한 방식과 종류의 요청을 처리할 것으로 예상되지만 정확한 요청 유형과 순서를 미리 알 수 없는 경우
- 요청을 처리할 수 있는 객체 집합이 동적으로 정의되어야 할 때 (체인 연결을 런타임에서 동적으로 설정)
패턴 장점
- 클라이언트는 처리 객체의 체인 집합 내부의 구조를 알 필요가 없다.
- 각각의 체인은 자신이 해야하는 일만 하기 때문에 새로운 요청에 대한 처리객체 생성이 편리해진다.
- 클라이언트 코드를 변경하지 않고 핸들러를 체인에 동적으로 추가하거나 처리 순서를 변경하거나 삭제할 수 있어 유연해진다
- 요청의 호출자(invoker)와 수신자(receiver) 분리시킬 수 있다.
- 요청을 하는 쪽과 요청을 처리하는 쪽을 디커플링 시켜 결합도를 낮춘다
- 요청을 처리하는 방법이 바뀌더라도 호출자 코드는 변경되지 않는다.
패턴 단점
- 실행 시에 코드의 흐름이 많아져서 과정을 살펴보거나 디버깅 및 테스트가 쉽지 않다.
- 충분한 디버깅을 거치지 않았을 경우 집합 내부에서 무한 사이클이 발생할 수 있다.
- 요청이 반드시 수행된다는 보장이 없다. (체인 끝까지 갔는데도 처리되지 않을 수 있다)
- 책임 연쇄로 인한 처리 지연 문제가 발생할 수 있다. 다만 이는 트레이드 오프로서 요청과 처리에 대한 관계가 고정적이고 속도가 중요하면 책임 연쇄 패턴 사용을 유의하여야 한다.
'CS > Design Pattern' 카테고리의 다른 글
빌더 패턴 (Builder Pattern) (1) | 2024.06.09 |
---|---|
플라이웨이트 패턴 (Flyweight Pattern) (1) | 2024.06.08 |
프록시 패턴 (Proxy Pattern) (0) | 2024.06.03 |
중재자 패턴 (Mediator Pattern) (0) | 2024.04.18 |
옵서버 패턴 (Observer Pattern) (0) | 2024.04.18 |