1. 용도
요청 자체를 캡슐화하여 요청이 서로 다른 사용자를 매개변수로 만들고, 요청을 대기시키거나 로깅하며, 되돌릴 수 있는 연산을 지원합니다.
2. 활용성
- 수행할 동작을 객체로 매개변수화하고자 할 때
- 서로 다른 시간에 요청을 명시하고 저장하며 실행하고 싶을 때
- 실행 취소 기능을 지원하고 싶을 때, 객체에 Unexecute()를 만들어 수행하도록 함
- 시스템이 고장 났을 때 재적용이 가능하도록 변경 과정에 대한 로깅을 지원하고 싶을 때
- 기본적인 연산의 조합으로 만든 상위 수준 연산을 써서 시스템을 구조화하고 싶을 때
3. Class Diagram과 구조
[Command] - 연산 수행에 필요한 인터페이스를 선언합니다.
[ConcreteCommand] - 객체와 액션 간의 연결성을 정의합니다. 또한 Execute로 연산을 정의합니다.
[Client] - 객체를 생성하고 처리 객체로 정의합니다.
[Invoker] - 명령어에 처리를 수행할 것을 요청합니다.
[Receiver] - 요청에 관련된 연산 수행 방법을 알고 있습니다. 어떤 클래스도 요청 수신자로서 동작할 수 있습니다.
사용자는 ConcreteCommand 객체를 생성하고 이를 수신자로 지정하고, Invoker 클래스는 ConcreteCommand 객체를 저장하여 command에 정의된 Execute를 호출하여 요청을 발생시킵니다.
4. 장단점
장점
- Command로 인한 연산 호출 객체와 연산 수행 방법 구현 객체의 분리
- Command 객체의 조작 및 확장 가능
- 명령어 조합을 통한 복합 명령 생성 가능
- 새로운 Command 객체 추가 용이
5. 구현 방법
- 명령어의 설정 - 다양한 기능에 대해 정리를 해야하는데 예를 들면 처리 요청을 수행하는 액션과 이를 받는 객체 사이의 연결 관계 정의 등이 존재합니다.
- undo 및 redo 연산 지원 - 이력 목록에 상태 정보 관리
- 최소 도중 오류 누적 회피 - 처리 결과를 취소 했을 때 원래의 상태로 보귀했는지 확인하는 작업이 요구됨
- C++ 템플릿 사용 - C++ 템플릿 활용을 통해 모든 명령에서 Command를 상속받을 필요가 사라짐
'C++공부 > GoF의 디자인 패턴' 카테고리의 다른 글
반복자(Iterator) (0) | 2022.06.01 |
---|---|
해석자(Interpreter) (0) | 2022.06.01 |
책임 연쇄(Chain of Responsibility) (0) | 2022.06.01 |
단일체(Singleton) (0) | 2022.05.18 |
원형(Prototype) (0) | 2022.05.18 |