Hura! Mamy wreszcie przyjemność udostępnić wam polską wersję! Zapraszamy do przesyłania wiadomości z waszymi uwagami i informacjami o zauważonych błędach.
Polecenie

Polecenie w języku Go

Polecenie to behawioralny wzorzec projektowy według którego żądania lub proste działania są konwertowane na obiekty.

Wyżej wymieniona konwersja pozwala odkładać zadania w czasie, uruchamiać je zdalnie, przechowywać ich historię, itp.

Przykład koncepcyjny

Popatrzmy na przykład użycia wzorca Polecenie opartego na telewizorze. TV można włączyć poprzez:

  • Włącznik na pilocie;
  • Włącznik na samym telewizorze.

Zaczynamy od zaimplementowania polecenia WŁĄCZ którego odbiorcą będzie TV. Wywołanie metody execute polecenia spowoduje wywołanie przezeń funkcji TV.on. Ostatnim elementem jest definicja nadawcy. Mamy bowiem i pilota i sam TV, a oba będą zawierać obiekt-polecenie WŁĄCZ.

Zwróćmy uwagę, że opakowaliśmy to samo żądanie w kilka wywoływaczy. Podobnie można postąpić z innymi poleceniami. Zaletą tworzenia osobnego obiektu polecenie jest rozsprzęgnięcie logiki graficznego interfejsu użytkownika od logiki biznesowej. Nie trzeba opracowywać różnych obsługujących dla każdego z nadawców. Obiekt polecenie zawiera wszystkie niezbędne informacje, może więc też być użyty do opóźnienia wykonania.

button.go: Nadawca

package main

type button struct {
	command command
}

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

command.go: Interfejs polecenia

package main

type command interface {
	execute()
}

onCommand.go: Konkretne polecenie

package main

type onCommand struct {
	device device
}

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

offCommand.go: Konkretne polecenie

package main

type offCommand struct {
	device device
}

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

device.go: Interfejs odbiorcy

package main

type device interface {
	on()
	off()
}

tv.go: Konkretny odbiorca

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: Kod klienta

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: Wynik działania

Turning tv on
Turning tv off
Na podstawie: Golang By Example

Polecenie w innych językach

Wzorce projektowe: Polecenie w języku Java Wzorce projektowe: Polecenie w języku C# Wzorce projektowe: Polecenie w języku C++ Wzorce projektowe: Polecenie w języku PHP Wzorce projektowe: Polecenie w języku Python Wzorce projektowe: Polecenie w języku Ruby Wzorce projektowe: Polecenie w języku Swift Wzorce projektowe: Polecenie w języku TypeScript