关于命令模式的例子
客户点单,创造订单给服务员,服务员将订单给厨师,厨师烹饪。
用户使用遥控器,创造命令对象(关电视)给遥控器,遥控对象(电视)关闭。
遥控器代码的简单示例:
逻辑关系
实现遥控器,遥控器有插槽,一个插槽对应一个command对象,插槽的下按对应command对象的命令,这样遥控器不用管这个命令的具体实现,只要调用自己的插槽就可以了。
这里的command对象对应的是服务员,服务员点单的行为对应的是命令对象的excute()
type Command interface {
execute()
}
//点灯
type Light struct{
}
func (p *Light) On() {
fmt.Println("light on.")
}
//灯的命令
type LightOnCommand struct{
light Light
}
func (p *LightOnCommand) LightOnCommand(light Light) {
p.light = light
}
func (p *LightOnCommand) execute() {
p.light.On()
}
//遥控器
type SimpleRemoteControl struct{
slot Command
}
func (p *SimpleRemoteControl) setCommand(command Command) {
p.slot = command
}
func (p *SimpleRemoteControl) buttonWasPressed() {
p.slot.execute()
}
func main() {
remote:=new(SimpleRemoteControl)
light:=new(Light)
lightOnCo:=new(LightOnCommand)
lightOnCo.light = *light
remote.setCommand(lightOnCo)
remote.buttonWasPressed()
}
整体分析
遥控器内包含命令类
命令类内包含实际对象电灯
这样遥控器与电灯解耦,只用关注自己调用的是什么命令类
使用
遥控器调用自己的命令,命令内有具体的命令类对象调用自己对象的接口进行真正的对应操作
定义
命令模式将请求分装成对象,以便使用不同的请求,队列或者日志来参数化其他对象。命令模式也支持可撤销的操作。