1.1 정의 및 개념

명령 패턴은 요청을 객체로 캡슐화하여 클라이언트를 다양한 요청으로 매개변수화할 수 있게 하는 행동 디자인 패턴입니다.

1.2 목적

명령 패턴의 주요 목적은 발신자와 수신자를 분리하는 것입니다. 요청을 객체로 캡슐화하여 발신자가 수신자와 직접 상호 작용하지 않고 명령 객체와 상호 작용하도록 합니다.

2. 특징 및 명령 패턴의 장점

명령 패턴은 다음과 같은 특징과 장점을 갖고 있습니다:

  • 요청을 객체로 캡슐화하여 발신자와 수신자를 분리합니다.
  • 요청을 대기열에 넣거나 로그를 기록하고 실행 취소 작업을 수행할 수 있습니다.
  • 원본 코드를 수정하지 않고 새로운 명령을 확장할 수 있습니다.

3. 명령 패턴의 실제 응용 예

명령 패턴은 다음 시나리오에서 적용됩니다:

  • 명령을 수행하는 객체에서 요청을 분리해야 하는 경우
  • 실행 취소 및 다시 실행 작업을 지원해야 하는 경우
  • 대기열 방식으로 일련의 작업을 실행해야 하는 경우

4.1 UML 클래스 다이어그램

Golang 명령 패턴

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. 명령 패턴과 전략 패턴의 차이

명령 패턴과 전략 패턴은 어느 정도 유사하지만, 모두 특정 행동을 객체로 캡슐화합니다. 그러나 명령 패턴은 주로 요청을 객체로 캡슐화하고 실행 취소 및 실행 대기열과 같은 기능을 구현하는 데 사용되는 반면, 전략 패턴은 주로 일련의 알고리즘을 캡슐화하고 실행 시점에 알고리즘을 동적으로 선택하는 데 사용됩니다.

명령 패턴은 로깅 및 회계와 같은 작업에 적합하며, 전략 패턴은 비즈니스 로직의 유연한 변경에 적합합니다.