Глянь мій новий курс по Git! Привіт! Глянь мій новий курс по Git! Привіт! Глянь мій новий курс по Git на GitByBit.com! Привіт! Хочеш класно освіжити Git? Глянь мій новий курс на GitByBit.com!
Команда

Команда на 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

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

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