디자인패턴

책임 연쇄 패턴(Chain of Responsibility Pattern)

JUNGKEUNG 2022. 10. 8. 17:23
반응형

책임 연쇄 패턴이란?

요청을 보내는 쪽(sender)과 요청을 처리하는(receiver) 쪽을 분리하는 패턴이다.

  • 핸들러 체인을 사용해서 요청을 처리한다.

클라이언트로부터의 요청을 처리할 수 있는 처리 객체를 Chain으로 만들어 결합을 느슨하게 하기 위해 만들어진 패턴이다.

일반적으로 요청을 처리할 수 있는 객체를 찾을 때까지 집합 안에서 요청을 전달한다.

 

예제 코드

public abstract class Handler {
    public String name;
    private Handler next;

    public Handler(String name) {
        this.name = name;
    }

    public void setNext(Handler next) {
        this.next = next;
    }

    public void handleRequest(int number) {
        if (canHandle(number)) {
            print(number);
//            chain이 연결되어 있으면 다음 처리 객체에 문제 전달 (oddHandler -> evenHandler 순으로 처리)
        } else if (next != null) {
            next.handleRequest(number);
        } else {
            System.out.println("처리할 수 있는 객체 없음");
        }
    }

    public void print(int number) {
        System.out.println(number + ":" + name + "로 처리");
    }

    public abstract boolean canHandle(int number);

}
public class OddHandler extends Handler {
    public OddHandler(String name) {
        super(name);
    }

    public boolean canHandle(int number) {
        return number % 2 != 0;
    }
}
public class EvenHandler extends Handler {
    public EvenHandler(String name) {
        super(name);
    }

    public boolean canHandle(int number) {
        return number % 2 == 0;
    }
}
Handler oddHandler = new OddHandler("홀수");
Handler evenHandler = new EvenHandler("짝수");

// chain 연결 oddHandler -> evenHandler
oddHandler.setNext(evenHandler);

for (int i = 1; i <= 10; i++) {
    oddHandler.handleRequest(i);
}

 

 

 

장점

  • 결합도를 낮추며, 요청의 발신자와 수신자를 분리시킬 수 있다
  • 클라이언트는 처리 객체의 집합 내부의 구조를 알 필요가 없다
  • 집합 내의 처리 순서를 변경하거나 처리 객체를 추가 또는 삭제할 수 있어 유연성이 향상된다
  • 새로운 요청에 대한 처리객체 생성이 매우 편리해진다

 

 

단점

  • 충분한 디버깅을 거치지 않을 경우 집합 내부에서 사이클이 발생할 수 있다
  • 디버깅 및 테스트가 쉽지 않다

 

 

Script

클라이언트로부터의 요청을 처리 할 수 있는 처리 객체를 Chain으로 만들어 결합을 느슨하게 하기 위해 만들어진 패턴이다.

 

개인적으로 빠른 반응성이 필요한 성능 적으로 느릴 수 있고 조건 탐색에 있어 많은 비용을 요구할 수가 있다. 자칫 잘못하면 무한 루프에 빠질 가능성도 있고 그것이 아니라도 정밀 검사하기도 쉽지가 않을 거 같다

 

 

 

참고


https://www.inflearn.com/course/%EB%94%94%EC%9E%90%EC%9D%B8-%ED%8C%A8%ED%84%B4