본문 바로가기
java

Design Patterns - Chain of Responsibility

by 쭈꾸마뇽 2022. 1. 30.

요청을 보내는 쪽(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();
    }
}
  • 장점
    • 클라이언트 코드를 변경하지 않고 새로운 핸들러를 체인에 추가할 수 있다
    • 각각의 체인은 자신이 해야하는 일만 한다
    • 체인을 다양한 방법으로 구성할 수 있다
  • 단점
    • 디버깅이 어렵다

 

 

코딩으로 학습하는 GoF의 디자인 패턴 - 인프런 | 강의

디자인 패턴을 알고 있다면 스프링 뿐 아니라 여러 다양한 기술 및 프로그래밍 언어도 보다 쉽게 학습할 수 있습니다. 또한, 보다 유연하고 재사용성이 뛰어난 객체 지향 소프트웨어를 개발할

www.inflearn.com

 

'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

댓글