디자인 패턴

Chain Of Responsibility Pattern

kyoulho 2024. 4. 27. 16:45

책임 연쇄 패턴은 요청을 만족시킬 수 있는 객체를 연결하여 요청을 처리하는 패턴이다.

장점

  • 요청을 보내는 객체와 요청을 처리하는 객체들 간의 결합을 피하며, 요청을 처리할 수 있는 객체를 동적으로 연결할 수 있게 한다.

책임 연쇄 패턴이 사용되는 상황

  • 여러 객체가 순차적으로 처리되어야 할 경우
  • 요청이 처리할 수 있는 객체가 동적으로 변경되어야 하는 경우
  • 요청의 처리자를 명시적으로 지정하지 않고, 체인 상의 객체 중 하나가 처리를 담당할 수 있는 경우

구성 요소

  1. Handler(처리자) 인터페이스 또는 추상 클래스
    • 요청을 처리하는 메서드를 선언한다.
    • 다음 처리자를 설정하는 메서드를 정의한다.
  2. 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