책임 연쇄 패턴은 요청을 만족시킬 수 있는 객체를 연결하여 요청을 처리하는 패턴이다.
장점
- 요청을 보내는 객체와 요청을 처리하는 객체들 간의 결합을 피하며, 요청을 처리할 수 있는 객체를 동적으로 연결할 수 있게 한다.
책임 연쇄 패턴이 사용되는 상황
- 여러 객체가 순차적으로 처리되어야 할 경우
- 요청이 처리할 수 있는 객체가 동적으로 변경되어야 하는 경우
- 요청의 처리자를 명시적으로 지정하지 않고, 체인 상의 객체 중 하나가 처리를 담당할 수 있는 경우
구성 요소
- Handler(처리자) 인터페이스 또는 추상 클래스
- 요청을 처리하는 메서드를 선언한다.
- 다음 처리자를 설정하는 메서드를 정의한다.
- ConcreteHandler(구체적인 처리자) 클래스
- Handler를 구현하며 실제로 요청을 처리하는 역할을 한다.
- 자신이 처리할 수 있는 경우에만 처리하고, 그렇지 않으면 다음 처리자에게 요청을 전달한다.
예제
// 핸들러 인터페이스
public interface Handler {
void handleRequest(Request request);
}
// RequestType.TYPE1 를 처리하는 핸들러
public class ConcreteHandler1 implements Handler {
private Handler nextHandler;
@Override
public void handleRequest(Request request) {
if (request.getType() == RequestType.TYPE1) {
System.out.println("Request handled by ConcreteHandler1");
} else if (nextHandler != null) {
nextHandler.handleRequest(request);
}
}
public void setNextHandler(Handler nextHandler) {
this.nextHandler = nextHandler;
}
}
// RequestType.TYPE2 를 처리하는 핸들러
public class ConcreteHandler2 implements Handler {
private Handler nextHandler;
@Override
public void handleRequest(Request request) {
if (request.getType() == RequestType.TYPE2) {
System.out.println("Request handled by ConcreteHandler2");
} else if (nextHandler != null) {
nextHandler.handleRequest(request);
}
}
public void setNextHandler(Handler nextHandler) {
this.nextHandler = nextHandler;
}
}
public class Client {
public static void main(String[] args) {
Handler handler1 = new ConcreteHandler1();
Handler handler2 = new ConcreteHandler2();
handler1.setNextHandler(handler2);
// 요청 생성
Request request1 = new Request(RequestType.TYPE1);
Request request2 = new Request(RequestType.TYPE2);
// 요청 보내기
handler1.handleRequest(request1);
handler1.handleRequest(request2);
}
}
public class Request {
private RequestType type;
public Request(RequestType type) {
this.type = type;
}
public RequestType getType() {
return type;
}
}
public enum RequestType {
TYPE1, TYPE2
}
728x90
'디자인 패턴' 카테고리의 다른 글
Decorator Pattern (0) | 2024.05.05 |
---|---|
Composite Pattern (1) | 2024.05.01 |
Command Pattern (0) | 2024.04.28 |
Bridge Pattern (0) | 2024.04.10 |
Adapter Pattern (0) | 2024.04.10 |