요청을 보내는 쪽(Sender)과 요청을 처리하는 쪽(Receiver)을 분리하는 패턴
핸들러 체인을 사용해서 요청을 처리한다
public abstract class RequestHandler {
private RequestHandler nextHandler;
public RequestHandler(RequestHandler nextHandler) {
this.nextHandler = nextHandler;
}
public void handle(Request request) {
if (nextHandler != null) {
nextHandler.handle(request);
}
}
}
뼈대가 되는 추상클래스는 인스턴스변수로 다음 핸들러 역할을 할 대상을 갖고 있는다
public class AuthRequestHandler extends RequestHandler {
public AuthRequestHandler(RequestHandler nextHandler) {
super(nextHandler);
}
@Override
public void handle(Request request) {
System.out.println("인증이 되었는가?");
super.handle(request);
}
}
public class PrintRequestHandler extends RequestHandler {
public PrintRequestHandler(RequestHandler nextHandler) {
super(nextHandler);
}
@Override
public void handle(Request request) {
System.out.println(request.getBody());
super.handle(request);
}
}
각각의 구현클래스들은 본인의 로직을 수행하면서 인스턴스변수로 들어온 핸들러의 역할도 수행한다
public class Client {
private RequestHandler requestHandler;
public Client(RequestHandler requestHandler) {
this.requestHandler = requestHandler;
}
public void doWork() {
Request request = new Request("이번 놀이는 뽑기입니다.");
requestHandler.handle(request);
}
public static void main(String[] args) {
RequestHandler chain = new AuthRequestHandler(new LoggingRequestHandler(new PrintRequestHandler(null)));
Client client = new Client(chain);
client.doWork();
}
}
- 장점
- 클라이언트 코드를 변경하지 않고 새로운 핸들러를 체인에 추가할 수 있다
- 각각의 체인은 자신이 해야하는 일만 한다
- 체인을 다양한 방법으로 구성할 수 있다
- 단점
- 디버깅이 어렵다
'java' 카테고리의 다른 글
Design Patterns - Command (0) | 2022.03.01 |
---|---|
Design Patterns - Proxy (0) | 2022.01.16 |
Design Patterns - Flyweight (0) | 2021.12.21 |
Design Patterns - Facade (0) | 2021.12.10 |
Design Patterns - Decorator (0) | 2021.12.04 |
댓글