命令模式概述
命令模式将“请求”封装成对象,以便使用不同的请求、队列或者日志来参数化其他对象。同时命令模式也支持可撤销的操作。
模式实例
比如餐厅里的女招待,一整天下来参数化许多的订单。又比如一个简单的遥控器,这个遥控器的按键command被抽象化为一个接口,只需要用譬如“打开电灯”、“打开车库门”之类的命令实现这个接口。就可以轻易的实现命令模式。
UML图示例
如上所示的图中,声明了一个Command接口,ConcreteCommand实现了Command接口,Invoker是一个调用者,它不需要了解ConcerteCommand的实现细节,但是了解接口实现的功能。Client被视为命令模式的客户。
Go实现代码
type Command interface {
Execute()
Undo()
}
type Light struct {
}
func (this *Light) Execute() {
log.Println("The light is opening.")
}
func (this *Light) Undo() {
}
type SimpleRemoteControl struct {
Slot Command
}
func (this *SimpleRemoteControl)SetCommand(command Command) {
this.Slot = command
}
func (this *SimpleRemoteControl)ButtonWasPressed() {
this.Slot.Execute()
}
func main() {
remote := SimpleRemoteControl{}
light := Light{}
remote.SetCommand(&light)
remote.ButtonWasPressed()
}
上述所示的代码中main函数是命令模式中的客户,Light是命令接收者,SimpleRemoteControl是调用者。
用途及优点
命令模式中的命令可以将运算块打包,然后将该运算块传来传去,在实际应用中可以被不同的线程使用,线程池、工作队列都是其应用。该模式将调用者和接受者解耦,通过命令对象进行沟通,针对接口编程,不针对实现编程。
缺点
使用命令模式会导致系统中有过多的具体命令类。因为针对一种命令实现一个命令类。