golang命令模式

命令模式概述

命令模式将“请求”封装成对象,以便使用不同的请求、队列或者日志来参数化其他对象。同时命令模式也支持可撤销的操作。

模式实例

比如餐厅里的女招待,一整天下来参数化许多的订单。又比如一个简单的遥控器,这个遥控器的按键command被抽象化为一个接口,只需要用譬如“打开电灯”、“打开车库门”之类的命令实现这个接口。就可以轻易的实现命令模式。

UML图示例

golang命令模式
如上所示的图中,声明了一个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是调用者。

用途及优点

命令模式中的命令可以将运算块打包,然后将该运算块传来传去,在实际应用中可以被不同的线程使用,线程池、工作队列都是其应用。该模式将调用者和接受者解耦,通过命令对象进行沟通,针对接口编程,不针对实现编程。

缺点

使用命令模式会导致系统中有过多的具体命令类。因为针对一种命令实现一个命令类。

上一篇:GAMES101-现代计算机图形学入门-闫令琪——Lecture 16 Ray Tracing 4 学习笔记


下一篇:JavaScript设计模式与开发实践(三)--设计模式篇