반응형
책임 연쇄 패턴이란?
요청을 보내는 쪽(sender)과 요청을 처리하는(receiver) 쪽을 분리하는 패턴이다.
- 핸들러 체인을 사용해서 요청을 처리한다.
클라이언트로부터의 요청을 처리할 수 있는 처리 객체를 Chain으로 만들어 결합을 느슨하게 하기 위해 만들어진 패턴이다.
일반적으로 요청을 처리할 수 있는 객체를 찾을 때까지 집합 안에서 요청을 전달한다.
예제 코드
public abstract class Handler {
public String name;
private Handler next;
public Handler(String name) {
this.name = name;
}
public void setNext(Handler next) {
this.next = next;
}
public void handleRequest(int number) {
if (canHandle(number)) {
print(number);
// chain이 연결되어 있으면 다음 처리 객체에 문제 전달 (oddHandler -> evenHandler 순으로 처리)
} else if (next != null) {
next.handleRequest(number);
} else {
System.out.println("처리할 수 있는 객체 없음");
}
}
public void print(int number) {
System.out.println(number + ":" + name + "로 처리");
}
public abstract boolean canHandle(int number);
}
public class OddHandler extends Handler {
public OddHandler(String name) {
super(name);
}
public boolean canHandle(int number) {
return number % 2 != 0;
}
}
public class EvenHandler extends Handler {
public EvenHandler(String name) {
super(name);
}
public boolean canHandle(int number) {
return number % 2 == 0;
}
}
Handler oddHandler = new OddHandler("홀수");
Handler evenHandler = new EvenHandler("짝수");
// chain 연결 oddHandler -> evenHandler
oddHandler.setNext(evenHandler);
for (int i = 1; i <= 10; i++) {
oddHandler.handleRequest(i);
}
장점
- 결합도를 낮추며, 요청의 발신자와 수신자를 분리시킬 수 있다
- 클라이언트는 처리 객체의 집합 내부의 구조를 알 필요가 없다
- 집합 내의 처리 순서를 변경하거나 처리 객체를 추가 또는 삭제할 수 있어 유연성이 향상된다
- 새로운 요청에 대한 처리객체 생성이 매우 편리해진다
단점
- 충분한 디버깅을 거치지 않을 경우 집합 내부에서 사이클이 발생할 수 있다
- 디버깅 및 테스트가 쉽지 않다
Script
클라이언트로부터의 요청을 처리 할 수 있는 처리 객체를 Chain으로 만들어 결합을 느슨하게 하기 위해 만들어진 패턴이다.
개인적으로 빠른 반응성이 필요한 성능 적으로 느릴 수 있고 조건 탐색에 있어 많은 비용을 요구할 수가 있다. 자칫 잘못하면 무한 루프에 빠질 가능성도 있고 그것이 아니라도 정밀 검사하기도 쉽지가 않을 거 같다
참고
https://www.inflearn.com/course/%EB%94%94%EC%9E%90%EC%9D%B8-%ED%8C%A8%ED%84%B4
'디자인패턴' 카테고리의 다른 글
메멘토 패턴(Memento Pattern) (1) | 2022.10.08 |
---|---|
커맨드 패턴 (Command Pattern) (0) | 2022.10.08 |
템플릿 메소드 패턴(Template Method Pattern) (1) | 2022.09.25 |
전략패턴(Strategy Pattern) (1) | 2022.09.20 |
플라이웨이턴 패턴 (Flyweight Pattern) (0) | 2022.08.15 |