目录
????????命令模式(Command ?Pattern)将一个请求封装为一个对象(命令本身),使发出请求的责任(命令发送方)和执行请求的责任(命令接收方)分割开。将请求的发送者和接收者解耦,并提供一种灵活的方式来处理请求。命令模式可以用于实现撤销、重做、队列请求等功能。
(1)优点:
(2)缺点:
package main
// 远程控制器系统,该系统可以通过遥控器发送不同的命令来控制电视、音响等设备的开关和音量。
// 遥控器上有多个按钮,每个按钮对应一个命令,当用户按下按钮时,命令对象会执行相应的操作。
import "fmt"
// 命令接口
type Command interface {
Execute()
}
// 具体命令:打开电视
type TVOnCommand struct {
tv *TV
}
func NewTVOnCommand(tv *TV) *TVOnCommand {
return &TVOnCommand{
tv: tv,
}
}
func (c *TVOnCommand) Execute() {
c.tv.On()
}
// 具体命令:关闭电视
type TVOffCommand struct {
tv *TV
}
func NewTVOffCommand(tv *TV) *TVOffCommand {
return &TVOffCommand{
tv: tv,
}
}
func (c *TVOffCommand) Execute() {
c.tv.Off()
}
// 接收者:电视
type TV struct {
isOn bool
}
func (t *TV) On() {
t.isOn = true
fmt.Println("TV is on")
}
func (t *TV) Off() {
t.isOn = false
fmt.Println("TV is off")
}
// 调用者:遥控器
type RemoteControl struct {
command Command
}
func (r *RemoteControl) SetCommand(command Command) {
r.command = command
}
func (r *RemoteControl) PressButton() {
r.command.Execute()
}
// 客户端代码
func main() {
tv := &TV{}
tvOnCommand := NewTVOnCommand(tv)
tvOffCommand := NewTVOffCommand(tv)
remoteControl := &RemoteControl{}
remoteControl.SetCommand(tvOnCommand)
remoteControl.PressButton()
remoteControl.SetCommand(tvOffCommand)
remoteControl.PressButton()
}