1.1 정의 및 개념
명령 패턴은 요청을 객체로 캡슐화하여 클라이언트를 다양한 요청으로 매개변수화할 수 있게 하는 행동 디자인 패턴입니다.
1.2 목적
명령 패턴의 주요 목적은 발신자와 수신자를 분리하는 것입니다. 요청을 객체로 캡슐화하여 발신자가 수신자와 직접 상호 작용하지 않고 명령 객체와 상호 작용하도록 합니다.
2. 특징 및 명령 패턴의 장점
명령 패턴은 다음과 같은 특징과 장점을 갖고 있습니다:
- 요청을 객체로 캡슐화하여 발신자와 수신자를 분리합니다.
- 요청을 대기열에 넣거나 로그를 기록하고 실행 취소 작업을 수행할 수 있습니다.
- 원본 코드를 수정하지 않고 새로운 명령을 확장할 수 있습니다.
3. 명령 패턴의 실제 응용 예
명령 패턴은 다음 시나리오에서 적용됩니다:
- 명령을 수행하는 객체에서 요청을 분리해야 하는 경우
- 실행 취소 및 다시 실행 작업을 지원해야 하는 경우
- 대기열 방식으로 일련의 작업을 실행해야 하는 경우
4.1 UML 클래스 다이어그램
4.2 예제 소개
이 예제에서는 명령 패턴의 간단한 구현을 만들겠습니다. 수신자로 TV를 가정하고 켜기 및 끄기 작업을 수행할 수 있습니다. 또한 호출자로 특정 명령을 설정하고 실행할 수 있는 원격 컨트롤러를 가집니다.
4.3.1 명령 인터페이스 정의
type ICommand interface {
Execute()
}
4.3.2 구체적인 명령 클래스 구현
type ConcreteCommand struct {
receiver IReceiver
}
func (c *ConcreteCommand) Execute() {
c.receiver.Action()
}
4.3.3 수신자 인터페이스 정의
type IReceiver interface {
Action()
}
4.3.4 구체적인 수신자 클래스 구현
type Receiver struct {}
func (r *Receiver) Action() {
fmt.Println("작업 수행 중")
}
4.3.5 호출자 역할 구현
type Invoker struct {
command ICommand
}
func (i *Invoker) SetCommand(command ICommand) {
i.command = command
}
func (i *Invoker) ExecuteCommand() {
i.command.Execute()
}
4.3.6 클라이언트 코드 예제
func main() {
receiver := &Receiver{}
command := &ConcreteCommand{receiver: receiver}
invoker := &Invoker{}
invoker.SetCommand(command)
invoker.ExecuteCommand()
}
5. 명령 패턴과 전략 패턴의 차이
명령 패턴과 전략 패턴은 어느 정도 유사하지만, 모두 특정 행동을 객체로 캡슐화합니다. 그러나 명령 패턴은 주로 요청을 객체로 캡슐화하고 실행 취소 및 실행 대기열과 같은 기능을 구현하는 데 사용되는 반면, 전략 패턴은 주로 일련의 알고리즘을 캡슐화하고 실행 시점에 알고리즘을 동적으로 선택하는 데 사용됩니다.
명령 패턴은 로깅 및 회계와 같은 작업에 적합하며, 전략 패턴은 비즈니스 로직의 유연한 변경에 적합합니다.