Потрібна крута книжка про патерни та ще й українською? Ось вона »
Команда

Команда на Go

Команда — це поведінковий патерн, що дозволяє загортати запити або прості операції в окремі об’єкти.

Це дозволяє відкладати виконання команд, вибудовувати їх у чергу, а також зберігати історію і робити скасування.

Концептуальний приклад

Давайте розглянемо патерн Команда на прикладі телевізора. ТV може бути увімкнено двома способами:

  • кнопка УВІМК на пульті дистанційного керування;
  • кнопка ВИМК на самому телевізорі.

Ми можемо почати з реалізації об’єкта команди УВІМК з телевізором у ролі одержувача. Коли на цю команду викликається метод execute, вона, у свою чергу, викликає функцію TV.on. Вищевказане визначає об’єкт виклику. Насправді ми матимемо два об’єкта виклику: пульт і сам ТВ. Обидва будуть містити об’єкт команди ВКЛ.

Зауважте, що ми обернули один і той же запит в кілька об’єкті виклику. Це ж саме можна робити і з іншими командами. Перевагою створення окремих об’єктів команд є відділення логіки користувацького інтерфейсу від внутрішньої бізнес-логіки. Немає потреби розробляти окремих виконавців для кожного об’єкта виклику — сама команда містить всю інформацію, необхідну для її виконання. Відповідно, її можна використовувати для відстроченого виконання завдання.

button.go: Відправник

package main

type button struct {
	command command
}

func (b *button) press() {
	b.command.execute()
}

command.go: Інтерфейс команд

package main

type command interface {
	execute()
}

onCommand.go: Конкретна команда

package main

type onCommand struct {
	device device
}

func (c *onCommand) execute() {
	c.device.on()
}

offCommand.go: Конкретна команда

package main

type offCommand struct {
	device device
}

func (c *offCommand) execute() {
	c.device.off()
}

device.go: Інтерфейс отримувача

package main

type device interface {
	on()
	off()
}

tv.go: Конкретний отримувач

package main

import "fmt"

type tv struct {
	isRunning bool
}

func (t *tv) on() {
	t.isRunning = true
	fmt.Println("Turning tv on")
}

func (t *tv) off() {
	t.isRunning = false
	fmt.Println("Turning tv off")
}

main.go: Клієнтський код

package main

func main() {
	tv := &tv{}

	onCommand := &onCommand{
		device: tv,
	}

	offCommand := &offCommand{
		device: tv,
	}

	onButton := &button{
		command: onCommand,
	}
	onButton.press()

	offButton := &button{
		command: offCommand,
	}
	offButton.press()
}

output.txt: Результат виконання

Turning tv on
Turning tv off
На основі: Golang By Example

Команда іншими мовами програмування

Команда на Java Команда на C# Команда на C++ Команда на PHP Команда на Python Команда на Ruby Команда на Swift Команда на TypeScript