CHAIN OF RESPONSIBILITY

Design Principle

  • Defines
    • 요청을 보내는 쪽(sender)과 요청을 처리하는 쪽(receiver)의 분리하는 패턴
    • Handler Chain 이라는 것을 사용해서 요청을 처리
  • Benefits
    • 클라이언트 코드를 변경하지 않고 새로운 핸들러를 체인에 추가할 수 있다.
    • 각각의 체인은 자신이 해야하는 일만 한다.
    • 체인을 다양한 방법으로 구성할 수 있다
  • Usage

책임 연쇄 패턴은 프레임워크에서 사용하는 필터, 인터셉터, 플러그인을 개발하기 위해 사용된다.

RequestHandler

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);
        }
    }
}

AuthRequestHandler

public class AuthRequestHandler extends RequestHandler {

    public AuthRequestHandler(RequestHandler nextHandler) {
        super(nextHandler);
    }

    @Override
    public void handle(Request request) {
        System.out.println("Authorization");
        super.handle(request);
    }
}

LoggingRequestHandler

public class LoggingRequestHandler extends RequestHandler {

    public LoggingRequestHandler(RequestHandler nextHandler) {
        super(nextHandler);
    }

    @Override
    public void handle(Request request) {
        System.out.println("Logging");
        super.handle(request);
    }
}

Client

public class Client {

    private RequestHandler requestHandler;

    public Client(RequestHandler requestHandler) {
        this.requestHandler = requestHandler;
    }

    public void doWork() {
        Request request = new Request("body");
        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();
    }
}

References

  • Gangs of Four Design Patterns
  • 设计模式之美 / 王争
  • Head First Design Pattern / 에릭 프리먼, 엘리자베스 프리먼, 케이시 시에라, 버트 베이츠 저 / O'REILLY
  • Java 객체지향 디자인 패턴 / 정인상, 채흥석 저 / 한빛미디어