This article was done using my notes from:
Alexander Shvets (2019), Dive into Design Patterns, Refactoring.Guru
Command
Command pattern turns a request into a stand-alone object that contains all information about the request. This transformation lets you pass requests as a method arguments, delay or queue a request’s execution, and support undoable operations.
Structure
Code
package main
import "fmt"
type Button struct {
command Command
}
func (b *Button) press() {
b.command.execute()
}
type Command interface {
execute()
}
type OnCommand struct {
device Device
}
func (c *OnCommand) execute() {
c.device.on()
}
type OffCommand struct {
device Device
}
func (c *OffCommand) execute() {
c.device.off()
}
type Device interface {
on()
off()
}
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")
}
func main() {
tv := &Tv{}
onCommand := &OnCommand{
device: tv,
}
offCommand := &OffCommand{
device: tv,
}
onButton := &Button{
command: onCommand,
}
onButton.press()
offButton := &Button{
command: offCommand,
}
offButton.press()
}