티스토리 뷰
책임 연쇄 패턴이란?
책임 연쇄 패턴은 클라이언트의 요청에 대한 처리를 하기 위해 여러 개의 처리 객체들로 나누고, 이들을 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 |
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- Chain of Responsibility
- 퍼싸드패턴
- 책임연쇄패턴
- 책임체인패턴
- 복합체 패턴
- 메멘토 패턴
- 프록시패턴
- 반복자 패턴
- 양방향연관관계
- 상태 패턴
- n+1
- restapi
- 플라이웨이트패턴
- 컴포지트패턴
- Flutter
- jpa
- Iterator Pattern
- springsecurity
- 구글로그인
- UML 필요성
- idtoken
- java문법
- ArrayDeque
- CompositePattern
- dfs
- 프로토타입 패턴
- 브리지 패턴
- 빌더 패턴
- GithubActions
- FacadePattern
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | |
7 | 8 | 9 | 10 | 11 | 12 | 13 |
14 | 15 | 16 | 17 | 18 | 19 | 20 |
21 | 22 | 23 | 24 | 25 | 26 | 27 |
28 | 29 | 30 | 31 |
글 보관함