设计模式
GoF提出的设计模式有23个,包括:
(1)创建型(Creational)模式:如何创建对象;
(2)结构型(Structural )模式:如何实现类或对象的组合;
(3)行为型(Behavioral)模式:类或对象怎样交互以及怎样分配职责。
行为型模式
命令模式
命令模式,将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤销的操作。
首先,我们定义命令接口。
// Command 是命令接口
type Command interface {
Execute()
}
然后,我们实现具体的命令,例如开灯命令和关闭灯命令。
type LightOnCommand struct {
Light *Light
}
func (loc *LightOnCommand) Execute() {
loc.Light.On()
}
type LightOffCommand struct {
Light *Light
}
func (loc *LightOffCommand) Execute() {
loc.Light.Off()
}
在这里,我们假设Light
对象已经实现了On()
和Off()
方法。
接下来,我们实现遥控器,这个遥控器可以设置命令并执行命令。
type SimpleRemoteControl struct {
slot Command
}
func (src *SimpleRemoteControl) SetCommand(command Command) {
src.slot = command
}
func (src *SimpleRemoteControl) ButtonWasPressed() {
src.slot.Execute()
}
最后,我们的客户端代码看起来像这样:
func main() {
remoteControl := &SimpleRemoteControl{}
light := &Light{}
//开灯命令
lightOnCommand := &LightOnCommand{Light: light}
//关闭灯命令
lightOffCommand := &LightOffCommand{Light: light}
remoteControl.SetCommand(lightOnCommand)
remoteControl.ButtonWasPressed()
remoteControl.SetCommand(lightOffCommand)
remoteControl.ButtonWasPressed()
}
优点: 1、降低了系统耦合度。 2、新的命令可以很容易添加到系统中去。
缺点:使用命令模式可能会导致某些系统有过多的具体命令类。
使用场景:认为是命令的地方都可以使用命令模式,比如: 1、GUI 中每一个按钮都是一条命令。 2、模拟 CMD。
注意事项:系统需要支持命令的撤销(Undo)操作和恢复(Redo)操作,也可以考虑使用命令模式,见命令模式的扩展。
命令模式结构示意图:
主要涉及到以下几个核心角色:
- 命令(Command):
- 定义了执行操作的接口,通常包含一个
execute
方法,用于调用具体的操作。
- 定义了执行操作的接口,通常包含一个
- 具体命令(ConcreteCommand):
- 实现了命令接口,负责执行具体的操作。它通常包含了对接收者的引用,通过调用接收者的方法来完成请求的处理。
- 接收者(Receiver):
- 知道如何执行与请求相关的操作,实际执行命令的对象。
- 调用者/请求者(Invoker):
- 发送命令的对象,它包含了一个命令对象并能触发命令的执行。调用者并不直接处理请求,而是通过将请求传递给命令对象来实现。
- 客户端(Client):
- 创建具体命令对象并设置其接收者,将命令对象交给调用者执行。
总结
命令模式为我们提供了一种将请求或操作封装到一个对象中的方法,它使我们的代码更具有可扩展性和复用性。希望本文能够帮助你理解命令模式,并在实际开发中找到其应用场景。
参考
使用Go语言实现命令模式
菜鸟教程命令模式
《研磨设计模式》读书笔记
Easy 搞定 Golang设计模式