1.1 Определение и концепция
Паттерн команды - это поведенческий паттерн проектирования, который позволяет инкапсулировать запрос в виде объекта, чтобы можно было параметризовать клиента различными запросами.
1.2 Цель паттерна команды
Основная цель паттерна команды - развязать отправителя и получателя. Инкапсулируя запрос в объект, отправитель должен взаимодействовать только с объектом команды, не взаимодействуя напрямую с получателем.
2. Характеристики и преимущества паттерна команды
Паттерн команды имеет следующие характеристики и преимущества:
- Инкапсуляция запроса в объект развязывает отправителя и получателя.
- Может очередь запросов, записывать журналы и выполнять операции отмены.
- Новые команды могут быть расширены без изменения исходного кода.
3. Примеры практического применения паттерна команды
Паттерн команды применим в следующих сценариях:
- Необходимо развязать запрос от объекта, выполняющего команду.
- Поддержка операций отмены и повтора.
- Выполнение набора операций в очереди.
4.1 UML-диаграмма классов
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. Различия между паттерном команды и паттерном стратегии
Паттерн команды и паттерн стратегии похожи в определенной степени, поскольку оба инкапсулируют определенное поведение в объекты. Разница заключается в том, что паттерн команды в основном используется для инкапсуляции запросов в виде объектов и реализации функций, таких как отмена и выполнение очередей, в то время как паттерн стратегии в основном используется для инкапсуляции ряда алгоритмов и динамического выбора одного алгоритма для выполнения во время выполнения.
Паттерн команды более подходит для операций, таких как ведение журнала и учет, в то время как паттерн стратегии более подходит для гибких изменений в бизнес-логике.