Go 指令形式解说和代码示例
指令是一种行为设计形式, 它可将恳求或简单操作转化为一个目标。
此类转化让你能够推迟进行或长途履行恳求, 还可将其放入队列中。
概念示例
下面咱们通过电视机的例子来了解指令形式。 你可通过以下方式翻开电视机:
- 按下遥控器上的 ON 开关;
- 按下电视机上的 ON 开关。
咱们能够从完成 ON 指令目标并以电视机作为接收者入手。 当在此指令上调用 execute
履行办法时, 办法会调用 TV.on
翻开电视函数。
最后的工作是界说恳求者: 这儿实践上有两个恳求者: 遥控器和电视机。 两者都将嵌入 ON 指令目标。
留意咱们是如何将相同恳求封装进多个恳求者的。 咱们也能够采用相同的方式来处理其他指令。 创立独立指令目标的优势在于可将 UI 逻辑与底层业务逻辑解耦。 这样就无需为每个恳求者开发不同的处理者了。 指令目标中包含履行所需的全部信息, 所以也可用于推迟履行。
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 (tv *TV) On() {
tv.isRunning = true
fmt.Println("Turning tv on")
}
func (tv *TV) Off() {
tv.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