JAVA/DesignPattern

Design Pattern 디자인 패턴 Chain of Responsibility Pattern 책임체인패턴

호두밥 2021. 12. 21. 20:38

Chain of Responsibility Pattern 책임체인패턴

행동패턴으로, 요청을 받아 수행할 객체들을 엮어내는 패턴입니다. 요청의 타입에 따라, 각 객체가 요청을 수행할 것인지, 다음 객체로 넘겨줄 것인지를 판단합니다. 

책임체인 패턴이 적합한 경우

  • 요청의 경우의 수에 따라 다른 종류의 작업이 진행되어야 하는 경우, 단 요청의 타입을 정의할 수 있고, 실행 순서를 미리 알 수 없는 경우
  • 정의된 순서에 따라 몇개의 작업이 진행되어야만 하는 경우
  • 런타임 시점에 작업의 순서나 작업 그룹을 정의해야 하는 경우

장단점

장점

  • 요청의 처리 순서를 결정할 수 있습니다.
  • 작업을 요청하는 클래스와 작업을 수행하는 클래스를 분리할 수 있습니다. (단일책임원칙)
  • 기존의 요청 코드(client code)를 수정하지 않고도 새로운 작업 그룹을 추가할 수 있습니다. (개방폐쇄원칙)

단점

  • 몇 개의 요청은 Chain으로 처리할 수 없을 수 있습니다.

 

Chain of Responsibility Pattern 책임체인패턴 구현

객체를 순차적으로 호출할 객체인 Chain을 생성합니다. 

Chain

public class Chain {

    Processor chain;

    public Chain() {
        build();
    }

    private void build() {
        chain = new PositiveProcessor(new ZeroProcessor(new NegativeProcessor(null)));
    }

    public void process(Integer request){
        chain.process(request);
    }

}

Processor

public abstract class Processor {
    private Processor processor;

    public Processor(Processor processor) {
        this.processor = processor;
    }

    public void process(Integer request){
        if( ! Objects.isNull(processor)){
            processor.process(request);
        }
    }

}

Negative Processor

public class NegativeProcessor extends Processor {

    public NegativeProcessor(Processor processor) {
        super(processor);
    }

    @Override
    public void process(Integer request) {
        if(request < 0){
            System.out.println("request is negative.");
            return;
        }
        super.process(request);

    }
}

Zero Processor

public class ZeroProcessor extends Processor {

    public ZeroProcessor(Processor processor) {
        super(processor);
    }

    @Override
    public void process(Integer request) {
        if(request == 0){
            System.out.println("request is zero.");
            return;
        }
        super.process(request);
    }
}

Positive Processor

public class PositiveProcessor extends Processor {

    public PositiveProcessor(Processor processor) {
        super(processor);
    }

    @Override
    public void process(Integer request) {
        if(request > 0){
            System.out.println("request is positive.");
            return;
        }
        super.process(request);
    }
}

Main

public class Main {
    public static void main(String[] args) {
        Chain chain = new Chain();
        chain.process(10);
        chain.process(0);
        chain.process(-10);
    }
}
request is positive.
request is zero.
request is negative.

참조