南通网站优建设,哪些网站做魔兽地图,wordpress外观主题制作,小企业做网站有用吗一、简介
命令模式#xff1a;将请求#xff08;命令#xff09;封装为一个对象#xff0c;这样可以使用不同的请求参数化其他对象#xff08;将不同请求依赖注入到其他对象#xff09;#xff0c;并且能够支持请求#xff08;命令#xff09;的排队执行、记录日志、…一、简介
命令模式将请求命令封装为一个对象这样可以使用不同的请求参数化其他对象将不同请求依赖注入到其他对象并且能够支持请求命令的排队执行、记录日志、撤销等附加控制功能。
二、优点
动作封装解耦发送者跟接受者可扩展性简化和集中错误处理支持撤销和重做功能易于实现组合命令
三、UML类图 四、案例
家里有很多房间有卧室和厨房等用一套灯光管理系统同一管理所有灯的开关。
package mainimport fmttype Light interface {On()Off()
}type KitchenLight struct {
}func NewKitchenLight() *KitchenLight {return KitchenLight{}
}func (*KitchenLight) On() {fmt.Println(Kitchen light is on)
}func (*KitchenLight) Off() {fmt.Println(Kitchen light is off)
}type LivingRoomLight struct {
}func NewLivingRoomLight() *LivingRoomLight {return LivingRoomLight{}
}func (*LivingRoomLight) On() {fmt.Println(Living room light is on)
}func (*LivingRoomLight) Off() {fmt.Println(Living room light is off)
}type Command interface {Execute()Undo()
}type LightOnCommand struct {Lights []Light
}func NewLightOnCommand(lights []Light) LightOnCommand {return LightOnCommand{Lights: lights}
}func (loc *LightOnCommand) Execute() {for _, light : range loc.Lights {light.On()}
}func (loc *LightOnCommand) Undo() {for _, light : range loc.Lights {light.Off()}
}type LightOffCommand struct {Lights []Light
}func NewLightOffCommand(lights []Light) LightOffCommand {return LightOffCommand{Lights: lights}
}func (loc *LightOffCommand) Execute() {for _, light : range loc.Lights {light.Off()}
}func (loc *LightOffCommand) Undo() {for _, light : range loc.Lights {light.On()}
}func main() {kitchenLight : NewKitchenLight()livingRoomLight : NewLivingRoomLight()lightOnCommand : NewLightOnCommand([]Light{kitchenLight, livingRoomLight})lightOnCommand.Execute()lightOnCommand.Undo()lightOffCommand : NewLightOffCommand([]Light{kitchenLight, livingRoomLight})lightOffCommand.Execute()lightOffCommand.Undo()
}五、对比
命令模式与策略模式的区别在策略模式中不同的策略具有相同的目的、不同的实现、互相之间可以替换。比如BubbleSort、SelectionSort都是为了实现排序的只不过一个是用冒泡排序算法来实现的另一个是用选择排序算法来实现的。而在命令模式中不同的命令具有不同的目的对应不同的处理逻辑并且互相之间不可替换。