티스토리 뷰
디자인 패턴 - 행동 패턴 10개중
- 책임 연쇄 패턴
- 커맨드 패턴
에 대해 공부한 내용을 포스팅 해보려고 한다.
책임 연쇄 패턴
책임 연쇄 패턴은 핸들러들의 체인을 따라 요청을 전달할 수 있게 해주는 행동 디자인 패턴이다.
각 핸들러는 요청을 받으면 요청을 처리할 지 아니면 다음 핸들러로 전달할지를 결정한다.
책임 연쇄 패턴은 2가지의 모습이 있다.
다음은 첫 번째 모습이다.
핸들러가 직렬으로 연결되어 있다. 핸들러는 요청을 받으면 요청을 처리하고 독립 실행 객체를 반환하여 다음 핸들러에 넘긴다. 물론 핸들러를 거치면서 중간에 종료될 수 있다. 이 때는 뒤의 핸들러들은 요청을 처리할 기회 조차 없다.
두 번째 책임 연쇄 패턴이다.
핸들러는 요청을 처리 받아도 처리 가능 / 불가능 으로만 구분한다. 그래서 책임 연쇄 패턴 1 과는 다른 모습을 가진다. 이동 과정도 트리의 leaf 부터 root까지 이동한다.
책임 연쇄 패턴 2에서는 핸들러가 요청을 처리하면서 독립 실행 객체를 반환하지 않으므로 같은 인터페이스를 구현해야 한다.
책임 연쇄 패턴의 장점은 다음과 같다.
- 요청의 처리 순서를 제어할 수 있다.
- 단일 책임 원칙을 위배하지 않는다.
- 개방 폐쇄 원칙을 지킨다.
하지만 단점도 있다.
- 핸들러에 의해 강제 종료되면 일부 요청들이 처리안될 수 있다.
커맨드 패턴
커맨드 패턴은 요청을 받으면 직접 연결하지 않고 정보가 포함된 독립 실행형 객체로 반환하는 디자인 패턴이다.
요청의 실행을 지연 또는 대기열에 넣을 수 있도록 하고 실행 취소를 구현할 수 있게 된다.
커맨드 패턴은 다음과 같은 상황에서 사용하길 권장한다.
위의 상황에서 각각의 세이브 객체들이 직접 로직에 접근하여 호출한다면 어떤 일이 발생할까? 하나의 기능이 여러곳에서 호출될 것이다. (물론 구분하게 만들 순 있다)
또한 각 세이브가 아닌 상위의 큰 세이브를 수정하게 된다면 상위의 세이브를 상속받는 하위 세이브들을 전부 수정해야 한다. 그렇다면 세이브에서 요청을 받는 로직도 전부 수정해야 할 것이다...
위의 상황에서 커맨드를 적용하면 다음과 같아진다.
각 객체는 커맨드를 통해 로직에 접근할 수 있다. 또한 이런 구조는 요청의 실행에 대한 지연도 구현할 수 있게 된다.
커맨드 패턴의 장점은 다음과 같다.
- 단일 책임 원칙을 위해바지 않는다.
- 개방 폐쇄 원칙을 준수한다.
- 실행 취소 / 다시 실행을 구현할 수 있게 된다.
- 지연되는 작업을 구현할 수 있다.
- 간단한 커맨드들의 집합을 복잡한 커맨드로 조합할 수 있다.
하지만 단점 또한 존재한다.
- 발송자-수신자 사이에 완전히 새로운 레이어를 도입하는 구조이다. (단일 커맨드) 때문에 코드가 더 복잡해진다.
'공부 > C++' 카테고리의 다른 글
[ 디자인 패턴 ] 행동 패턴 - 메멘토, 상태, 비지터 (0) | 2023.06.01 |
---|---|
[ 디자인 패턴 ] 행동 패턴 - 중재자 , 옵저버 (0) | 2023.05.30 |
스마트 포인터 (0) | 2023.05.23 |
템플릿 메타 프로그래밍 (0) | 2023.05.23 |
[ 알고리즘 ] 정렬 (0) | 2023.05.16 |
- Total
- Today
- Yesterday
- 개인공부
- 해시
- sort
- LV2
- UE5
- Ue
- level3
- 스택/큐
- 프로그래머스
- LV3
- 탐욕법
- 채팅서버
- 고득점 Kit
- 너비우선탐색
- 데디케이티드
- 힙
- 디자인 패턴
- C++
- 완전탐색
- IMGUI
- 정렬
- DFS
- greedy
- 재귀
- 누적합
- FPS
- Heap
- BFS
- Unreal 5.1
- 고득점kit
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 |