영권's

디자인 패턴(Behavioral) - Chain of Responsibility 본문

스터디/디자인 패턴

디자인 패턴(Behavioral) - Chain of Responsibility

ykkkk 2021. 8. 7. 05:02

Chain of Responsibility - 책임 사슬

Chain of Responsibility란 책임 떠넘기기와 같은 의미입니다.

 

어떤 요청이 발생했을 때 그 요청을 처리할 오브젝트를 직접 결정할 수 없는 경우, 복수의 오브젝트(객체)를 사슬(chain)처럼 연결해 두면, 그 오브젝트(객체)의 사슬을 차례로 돌아다니면서 목적한 오브젝트(객체)를 결정하는 방법을 생각할 수 있습니다.

이와 같은 패턴을 Chain of Responsbility라고 합니다.

 

책임을 떠넘기는 구조를 생각하면 이해하기 쉽습니다.

 

이떤 사람에게 요구를 합니다.

그 사람이 그것을 처리할 수 있으면 처리하고, 처리할 수 없으면 그 요구를 '다음 사람'에게 넘깁니다.

다음 사람이 그 요구를 처리할 수 있으면 처리 하고, 처리할 수 없으면 '또 다음 사람'에게 책임을 넘깁니다.

이것이 Chain of Responsibility 패턴 입니다.

 

CoR 패턴 기본 구조 클래스 다이어그램

Chain of Responsibility 클래스 다이어그램

Handler(처리자)의 역할

  • Handler는 요구를 처리하는 인터페이스를 결정하는 역할을 합니다
  • '다음 사람'을 준비해 두고 자신이 처리할 수 없는 요구가 나오면 그 사람에게 떠넘기기를 합니다.

ConcreteHandler(구체적인 처리자)의 역할

  • ConcreteHandler는 요구를 처리하는 구체적인 역할을 합니다.

Client(요구자)의 역할

  • Client는 최초의 ConcreteHandler 역할에 요구하는 일을 합니다. (ex. Main)

장점

  1. 요청 처리 순서를 제어할 수 있습니다.
  2. SRP(단일 책임 원칙) : 작업을 실행하는 클래스에서 작업을 호출하는 클래스를 분리할 수 있습니다.
  3. OCP(개방-폐쇄 원칙) : 기존 클라이언트 코드를 해제하지 않고 앱에 새 핸들러를 도입할 수 있습니다.

단점

  1. 일부 요청에 대해서는 처리되지 않을 수 있습니다.
    • CoR 패턴을 이용해 요청을 처리하면 유연성은 높아지지만 누가 요구를 처리할 것인지 미리 정하고 그 상대가 바로 처리하는 경우와 비교하면 CoR 패턴을 적용한 처리는 지연될 수 있습니다.

 

적용 할 수 있는 상황

  1. 프로그램이 다양한 방법으로 다양한 요청을 처리할 것으로 예상되지만, 요청의 정확한 유형과 순서를 미리 알 수 없는 경우 책임 사슬 패턴을 사용합니다.
    • CoR 패턴의 포인트는 요구를 하는 사람(Client)와 요구를 처리하는 사람(ConcreteHandler)을 유연하게 연결합니다.
    • Client는 처음 요구를 하면 그 뒤에는 사슬처럼 연결 되어있는 적절한 처리자에게 전달되어 처리됩니다.
  2. 여러 핸들러를 특정 순서로 실행해야 하는 경우 이 패턴을 사용합니다.
    • 체인의 핸들러를 어떤 순서로든 연결할 수 있으므로 모든 요청은 계획한대로 체인을 통과합니다.
  3. 런타임에 핸들러 세트와 해당 순서가 변경되어야 할 경우 CoR 패턴을 사용합니다.
    • 핸들러 클래스 내에 참조 필드에 대한 설정자를 제공하는 경우 핸들러를 동적으로 삽입하거나 제거하거나 순서를 변경할 수 있습니다.

 

 

 

 

CoR 디자인 패턴 예시 코드) 

https://github.com/choiyoungkwon12/Design-Patterns/tree/main/src/main/java/com/programmers/designpattern/begavioral/cor

 

예시 코드에 대한 설명

이름 설명
Trouble 발생한 트러블을 나타내는 클래스, 트러블 번호를 가진다
Support 트러블을 해결하는 추상 클래스
NoSupport 트러블을 해결하는 구상 클래스(항상 '처리하지 않는다')
LimitSupport 트러블을 해결하는 구상 클래스(지정한 번호 미만의 트러블을 해결)
OddSupport 트러블을 해결하는 구상 클래스(홀수 번호의 트러블을 해결)
SpecialSupport 트러블을 해결하는 구상 클래스(특정 번호의 트러블을 해결)
Main Support들의 사슬을 만들고 트러블을 발생시키는 동작 테스트용 클래스


참고 :

 

도서 : Java 언어로 배우는 디자인 패턴 입문

 

https://refactoring.guru/design-patterns/chain-of-responsibility

 

Chain of Responsibility

/ Design Patterns / Behavioral Patterns Chain of Responsibility Also known as: CoR, Chain of Command Intent Chain of Responsibility is a behavioral design pattern that lets you pass requests along a chain of handlers. Upon receiving a request, each handle

refactoring.guru

 

Comments