Chain of Responsibility Pattern란?

Chain of Responsibility Pattern은 객체지향 디자인 패턴 중 하나로, 객체 간의 연쇄적인 처리를 위해 사용됩니다. 이 패턴은 하나의 요청에 대해 적합한 객체를 찾을 때까지 객체들의 연쇄를 따라가는 방식으로 처리를 진행합니다. 이를 통해 요청에 대한 처리를 분산시키고, 객체들의 결합도를 낮추는 효과를 가져올 수 있습니다.

객체 간의 연쇄적인 처리를 위한 디자인 패턴

Chain of Responsibility Pattern을 사용하기 위해서는 처리 가능한 객체들을 연쇄적으로 연결하는 구조를 가지고 있어야 합니다. 이 구조는 일반적으로 LinkedList나 Tree 구조를 사용합니다. 각 객체는 자신이 처리할 수 있는 요청인지 판별하는 메소드를 구현하고, 처리할 수 있다면 요청을 처리하고 그렇지 않다면 다음 객체에게 요청을 전달합니다. 이 과정은 연쇄적으로 진행되며, 요청이 처리될 때까지 반복됩니다.

Java 코드 예시를 통해 이 과정을 살펴보겠습니다. 다음은 Chain of Responsibility Pattern을 사용하여 처리 가능한 객체들을 연결하는 예시입니다.

public abstract class Handler {
    protected Handler nextHandler;

    public void setNextHandler(Handler nextHandler) {
        this.nextHandler = nextHandler;
    }

    public abstract void handleRequest(Request request);
}

public class ConcreteHandler1 extends Handler {
    @Override
    public void handleRequest(Request request) {
        if (request.getType() == RequestType.TYPE1) {
            System.out.println("Handled by ConcreteHandler1");
        } else if (nextHandler != null) {
            nextHandler.handleRequest(request);
        }
    }
}

public class ConcreteHandler2 extends Handler {
    @Override
    public void handleRequest(Request request) {
        if (request.getType() == RequestType.TYPE2) {
            System.out.println("Handled by ConcreteHandler2");
        } else if (nextHandler != null) {
            nextHandler.handleRequest(request);
        }
    }
}

public class Request {
    private RequestType type;

    public Request(RequestType type) {
        this.type = type;
    }

    public RequestType getType() {
        return type;
    }
}

public enum RequestType {
    TYPE1, TYPE2
}

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);
        handler1.handleRequest(request1);

        Request request2 = new Request(RequestType.TYPE2);
        handler1.handleRequest(request2);
    }
}

위 예시에서 Handler는 추상 클래스로 구현되며, 다음 Handler를 가리키는 nextHandler 변수와 요청을 처리하는 handleRequest 메소드를 가지고 있습니다. ConcreteHandler1과 2는 이 Handler를 상속받아 각각 다른 요청에 대한 처리를 구현하고 있습니다. 마지막으로 Client 클래스에서는 Handler들을 연결하고 요청 객체를 생성하여 처리를 진행합니다.

Chain of Responsibility Pattern은 객체 간의 연쇄적인 처리를 위한 유용한 디자인 패턴입니다. 이를 사용하면 객체들의 결합도를 낮추고, 요청에 대한 처리를 분산시킬 수 있습니다. Java 코드 예시를 통해 이 과정을 살펴보았는데, 이를 참고하여 실제 코드에서 이 패턴을 사용해보면 좋을 것입니다.

Reference : Chain of Responsibility Pattern: 객체 간의 연쇄적인 처리를 위한 디자인 패턴

+ Recent posts