1.1 Определение и концепция

Паттерн команды - это поведенческий паттерн проектирования, который позволяет инкапсулировать запрос в виде объекта, чтобы можно было параметризовать клиента различными запросами.

1.2 Цель паттерна команды

Основная цель паттерна команды - развязать отправителя и получателя. Инкапсулируя запрос в объект, отправитель должен взаимодействовать только с объектом команды, не взаимодействуя напрямую с получателем.

2. Характеристики и преимущества паттерна команды

Паттерн команды имеет следующие характеристики и преимущества:

  • Инкапсуляция запроса в объект развязывает отправителя и получателя.
  • Может очередь запросов, записывать журналы и выполнять операции отмены.
  • Новые команды могут быть расширены без изменения исходного кода.

3. Примеры практического применения паттерна команды

Паттерн команды применим в следующих сценариях:

  • Необходимо развязать запрос от объекта, выполняющего команду.
  • Поддержка операций отмены и повтора.
  • Выполнение набора операций в очереди.

4.1 UML-диаграмма классов

Golang Command Pattern

4.2 Введение в пример

В этом примере мы создадим простую реализацию паттерна команды. Предположим, у нас есть телевизор в качестве получателя, способного выполнять действия включения и выключения. У нас также есть удаленный контроллер в качестве вызывающего, который может устанавливать конкретные команды и выполнять их.

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. Различия между паттерном команды и паттерном стратегии

Паттерн команды и паттерн стратегии похожи в определенной степени, поскольку оба инкапсулируют определенное поведение в объекты. Разница заключается в том, что паттерн команды в основном используется для инкапсуляции запросов в виде объектов и реализации функций, таких как отмена и выполнение очередей, в то время как паттерн стратегии в основном используется для инкапсуляции ряда алгоритмов и динамического выбора одного алгоритма для выполнения во время выполнения.

Паттерн команды более подходит для операций, таких как ведение журнала и учет, в то время как паттерн стратегии более подходит для гибких изменений в бизнес-логике.