영권's
디자인 패턴(Behavioral) - Chain of Responsibility 본문
Chain of Responsibility - 책임 사슬
Chain of Responsibility란 책임 떠넘기기와 같은 의미입니다.
어떤 요청이 발생했을 때 그 요청을 처리할 오브젝트를 직접 결정할 수 없는 경우, 복수의 오브젝트(객체)를 사슬(chain)처럼 연결해 두면, 그 오브젝트(객체)의 사슬을 차례로 돌아다니면서 목적한 오브젝트(객체)를 결정하는 방법을 생각할 수 있습니다.
이와 같은 패턴을 Chain of Responsbility라고 합니다.
책임을 떠넘기는 구조를 생각하면 이해하기 쉽습니다.
이떤 사람에게 요구를 합니다.
그 사람이 그것을 처리할 수 있으면 처리하고, 처리할 수 없으면 그 요구를 '다음 사람'에게 넘깁니다.
다음 사람이 그 요구를 처리할 수 있으면 처리 하고, 처리할 수 없으면 '또 다음 사람'에게 책임을 넘깁니다.
이것이 Chain of Responsibility 패턴 입니다.
CoR 패턴 기본 구조 클래스 다이어그램
Handler(처리자)의 역할
- Handler는 요구를 처리하는 인터페이스를 결정하는 역할을 합니다
- '다음 사람'을 준비해 두고 자신이 처리할 수 없는 요구가 나오면 그 사람에게 떠넘기기를 합니다.
ConcreteHandler(구체적인 처리자)의 역할
- ConcreteHandler는 요구를 처리하는 구체적인 역할을 합니다.
Client(요구자)의 역할
- Client는 최초의 ConcreteHandler 역할에 요구하는 일을 합니다. (ex. Main)
장점
- 요청 처리 순서를 제어할 수 있습니다.
- SRP(단일 책임 원칙) : 작업을 실행하는 클래스에서 작업을 호출하는 클래스를 분리할 수 있습니다.
- OCP(개방-폐쇄 원칙) : 기존 클라이언트 코드를 해제하지 않고 앱에 새 핸들러를 도입할 수 있습니다.
단점
- 일부 요청에 대해서는 처리되지 않을 수 있습니다.
- CoR 패턴을 이용해 요청을 처리하면 유연성은 높아지지만 누가 요구를 처리할 것인지 미리 정하고 그 상대가 바로 처리하는 경우와 비교하면 CoR 패턴을 적용한 처리는 지연될 수 있습니다.
적용 할 수 있는 상황
- 프로그램이 다양한 방법으로 다양한 요청을 처리할 것으로 예상되지만, 요청의 정확한 유형과 순서를 미리 알 수 없는 경우 책임 사슬 패턴을 사용합니다.
- CoR 패턴의 포인트는 요구를 하는 사람(Client)와 요구를 처리하는 사람(ConcreteHandler)을 유연하게 연결합니다.
- Client는 처음 요구를 하면 그 뒤에는 사슬처럼 연결 되어있는 적절한 처리자에게 전달되어 처리됩니다.
- 여러 핸들러를 특정 순서로 실행해야 하는 경우 이 패턴을 사용합니다.
- 체인의 핸들러를 어떤 순서로든 연결할 수 있으므로 모든 요청은 계획한대로 체인을 통과합니다.
- 런타임에 핸들러 세트와 해당 순서가 변경되어야 할 경우 CoR 패턴을 사용합니다.
- 핸들러 클래스 내에 참조 필드에 대한 설정자를 제공하는 경우 핸들러를 동적으로 삽입하거나 제거하거나 순서를 변경할 수 있습니다.
CoR 디자인 패턴 예시 코드)
예시 코드에 대한 설명
이름 | 설명 |
Trouble | 발생한 트러블을 나타내는 클래스, 트러블 번호를 가진다 |
Support | 트러블을 해결하는 추상 클래스 |
NoSupport | 트러블을 해결하는 구상 클래스(항상 '처리하지 않는다') |
LimitSupport | 트러블을 해결하는 구상 클래스(지정한 번호 미만의 트러블을 해결) |
OddSupport | 트러블을 해결하는 구상 클래스(홀수 번호의 트러블을 해결) |
SpecialSupport | 트러블을 해결하는 구상 클래스(특정 번호의 트러블을 해결) |
Main | Support들의 사슬을 만들고 트러블을 발생시키는 동작 테스트용 클래스 |
참고 :
도서 : Java 언어로 배우는 디자인 패턴 입문
https://refactoring.guru/design-patterns/chain-of-responsibility
'스터디 > 디자인 패턴' 카테고리의 다른 글
디자인 패턴(Behavioral) - Template Method (0) | 2021.09.02 |
---|---|
디자인 패턴(Behavioral) - Observer (0) | 2021.08.29 |
디자인 패턴(Behavioral) - Memento (0) | 2021.08.20 |
디자인 패턴(Behavioral) - Iterator (0) | 2021.08.13 |
디자인 패턴(Behavioral) - Command (0) | 2021.08.11 |
Comments