
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