Definition
커맨드 패턴(Command Pattern)을 사용하면 요청 내역을 객체로 캡슐화해서 객체를 서로 다른 요청 내역에 따라 매개변수화할 수 있다. 이러면 요청을 큐에 저장하거나 로그로 기록하거나 작업 취소 기능을 사용할 수 있다.
Situation
- Request는 변형 시간 또는 변형 주문으로 지정, 대기 및 실행해야 한다.
- Request들의 히스토리가 필요할 때
- 호출자는 호출을 처리하는 객체에서 분리되어야 한다.
- 이를 통해 대기열 및 콜백과 같은 기존의 객체 기반 관계에서 요청을 처리할 수 있다.
- 스레드 큐에서 커맨드를 하나씩 제거하면서 커맨드의 execute() 메소드를 호출한다. 메소드 실행이 끝나면 다시 큐에서 새로운 커맨드 객체를 가져간다.
- 리모컨의 각 슬롯에 명령을 할당. 리모컨이 인보커가 됨, 사용자가 버튼을 누르면 그 버튼에 맞는 커맨드 객체의 execute() 메소드가 호출되고, 리시버에서 특정 행동을 담당하는 메소드가 실행됨
- 객체를 작업들로 매개변수화할 때
- 작업을 대기열에 넣거나 실행을 예약하거나 원격으로 실행하려는 경우
- 되돌릴 수 있는 작업을 구현하려는 경우 (e.g. Undo 기능) -> 일부가 private일 수 있기 때문에 application의 상태를 저장하는 것은 쉽지 않다. Memento 패턴으로 완화 가능
Structure
Pros
- 단일 책임 원칙. 이러한 작업을 수행하는 클래스에서 작업을 호출하는 클래스를 분리할 수 있다.
- 개방/폐쇄 원칙. 기존 클라이언트 코드를 손상시키지 않고 앱에 새 명령을 도입할 수 있다.
- 실행 취소/다시 실행을 구현할 수 있다.
- 지연된 작업 실행을 구현할 수 있다.
- 간단한 명령 세트를 복잡한 명령으로 조합할 수 있다.
Cons
- 발신자와 수신자 사이에 완전히 새로운 계층을 도입하기 때문에 코드가 더 복잡해질 수 있다.
비슷한 패턴
- Chain of Responsibility, Command, Mediator 및 Observer는 요청의 발신자와 수신자를 연결하는 다양한 방법을 다룬다:
- Chain of Responsibility는 잠재적 수신자 중 하나가 처리할 때 까지 잠재적 수신자의 동적 사슬을 따라 순차적으로 요청을 전달한다.
- Command는 발신자와 수신자간의 단방향 연결을 설정한다.
- Mediator는 발신자와 수신자 간의 직접 연결을 제거하여 중재자 객체를 통해 간접적으로 통신한다.
- Observer를 사용하면 수신기가 수신 요청을 동적으로 구독 및 구독 취소할 수 있다.
- Chain of Responsibility의 핸들러는 Command로 구현할 수 있다. 이 경우 요청으로 표시되는 동일한 컨텍스트 객체에 대해 다양한 작업을 실행할 수 있다.
그러나 요청 자체가 Command 객체인 또 다른 접근 방식이 있다. 이 경우 체인에 연결된 일련의 서로 다른 컨텍스트에서 동일한 작업을 실행할 수 있다.
- "실행 취소"를 구현할 때 Command와 Memento를 함께 사용할 수 있다. 이 경우 Command는 대상 객체에 대해 다양한 작업을 수행하는 역할을 하는 반면, Memento는 명령이 실행되기 직전에 해당 객체의 상태를 저장한다.
- Command와 Strategy는 둘 다 일부 작업으로 객체를 매개변수화할 수 있기 때문에 비슷해 보일 수 있다. 그러나 이것들은 매우 다른 관심을 가지고 있다.
- Command를 사용하여 모든 작업을 객체로 변환할 수 있다. 작업의 매개변수는 해당 객체의 필드가 된다. 변환을 통해 작업 실행을 연기하고, 대기열에 넣고, 명령 기록을 저장하고, 원격 서비스에 명령을 보내는 등의 작업을 수행할 수 있다.
- 반면에 Strategy는 일반적으로 동일한 작업을 수행하는 다른 방법을 설명하므로 단일 컨텍스트 클래스내에서 이러한 알고리즘을 교환할 수 있다.
- Prototype은 명령 사본을 기록에 저장해야 할 때 도움이될 수 있다.
- Visitor를 Command 패턴의 강력한 버전으로 취급할 수 있다. 해당 객체는 다른 클래스의 다양한 객체에 대해 작업을 실행할 수 있다.
'Design Pattern' 카테고리의 다른 글
[Design Pattern] 퍼사드 패턴(Facade Pattern)에 대해 알아보자 (0) | 2022.07.14 |
---|---|
[Design Pattern] 어댑터 패턴(Adapter Pattern)에 대해 알아보자 (0) | 2022.07.12 |
[Design Pattern] 싱글턴 패턴(Single Pattern)에 대해 알아보자 (1) | 2022.06.26 |
[Design Pattern] 추상 팩토리 패턴(Abstract Factory Pattern)에 대해 알아보자 (0) | 2022.06.24 |
[Design Pattern] 팩토리 메소드 패턴(Factory Method Pattern)에 대해 알아보자 (0) | 2022.06.23 |
댓글