Chain Of Responsibility

2020. 5. 2. 17:59디자인 패턴

1. Chain Of Responsibility

 Chain Of Responsibility란 요청을 처리할 수 있는 기회를 하나 이상의 객체에 부여함으로써 요청하는 객체와 처리하는 객체 사이의 결합도를 제거하는 패턴입니다. 요청을 해결할 객체를 만날 때까지 객체 고리를 따라서 요청을 전달합니다. 일반적으로 처리할 수 있는 모든 객체들을 고리로 묶고 맨 처음 객체에게 전달하여 처리하지 못하면 다음 객체로 넘기는 방식으로 진행됩니다. 아래를 예제를 통해 어떻게 구현되는지 확인할 수 있습니다.
 예제를 보면 숫자를 요청으로 전달했을 때, 객체 고리를 따라서 데이터를 전달합니다.

체인

public interface Chain {
    public abstract void setNext(Chain nextInChain);
    public abstract void process(int request);
}

Negative Processor

public class NegativeProcessor implements Chain{
    private Chain nextInChain;

    @Override
    public void setNext(Chain nextInChain) {
        this.nextInChain = nextInChain;
    }

    @Override
    public void process(int request) {
        if(request < 0) {
            System.out.println("NegativeProcessor : " + request);
        } else {
            nextInChain.process(request);
        }
    }
}

Zero Processor

public class ZeroProcessor implements Chain{
    private Chain nextInChain;

    @Override
    public void setNext(Chain nextInChain) {
        this.nextInChain = nextInChain;
    }

    @Override
    public void process(int request) {
        if(request == 0) {
            System.out.println("ZeroProcessor : " + request);
        } else {
            nextInChain.process(request);
        }
    }
}

Positive Processor

public class PositiveProcessor implements Chain{
    private Chain nextInChain;

    @Override
    public void setNext(Chain nextInChain) {
        this.nextInChain = nextInChain;
    }

    @Override
    public void process(int request) {
        if(request > 0) {
            System.out.println("PositiveProcessor : " + request);
        } else {
            nextInChain.process(request);
        }
    }
}

Main

public class Main {
    public static void main(String[] args) {
        Chain c1 = new NegativeProcessor();
        Chain c2 = new ZeroProcessor();
        Chain c3 = new PositiveProcessor();

        c1.setNext(c2);
        c2.setNext(c3);

        c1.process(90);
}
}

2. Chain Of Responsibility의 특징

  • 결합도를 낮추며, 요청의 발신자와 수신자를 분리할 수 있습니다.
  • 클라이언트는 처리 객체 집합의 내부 구조를 알 필요가 없습니다.
  • 집합 내의 처리 순서를 변경하거나 처리 객체를 추가 또는 삭제할 수 있어 유연성이 향상됩니다.
  • 새로운 요청에 대한 처리 객체 생성이 매우 편리합니다.
  • 충분한 디버깅을 거치지 않을 경우, 집합 내부에서 사이클이 발생할 수 있습니다.
728x90

'디자인 패턴' 카테고리의 다른 글

Composite Pattern  (0) 2020.07.03
Factory Pattern  (0) 2020.05.06
Observer Pattern  (0) 2020.05.02
Template Method Pattern  (0) 2020.05.01
Singleton Pattern  (0) 2020.04.27