命令模式通过将请求封装成一个对象,从而允许客户端将请求参数化并能够在不同的时间、队列或者请求执行和调用请求的地方进行参数化和传递。命令模式的核心思想是将请求和执行解耦,使得请求的发送方和接收方彼此独立。通过将请求封装成一个对象,可以灵活地参数化和传递请求,同时支持多种操作的排队、撤销和重做等功能。
在命令模式中,包括以下几个核心角色:
1. 命令(Command):命令是一个接口或者抽象类,定义了执行操作的方法。它包含一个执行操作的方法(如execute()),并可能包含其他方法来设置命令的接收者。
2. 具体命令(ConcreteCommand):具体命令是命令接口的具体实现,它实现了命令的执行操作。它包含了一个接收者对象,并将具体操作委托给接收者来执行。
3. 接收者(Receiver):接收者是执行命令所代表的操作。任何类都可以充当接收者,只要它能够实现命令的执行操作即可。
4. 调用者/请求者(Invoker/Requester):调用者是包含了具体命令对象的对象。调用者将命令对象作为参数或者通过其它方式传递给具体命令,并在需要的时候触发命令的执行。
5. 客户端(Client):客户端创建具体命令对象,并将其传递给调用者来执行命令。
示例:
// 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()
}
//遥控器
type SimpleRemoteControl struct {
slot Command
}
func (src *SimpleRemoteControl) SetCommand(command Command) {
src.slot = command
}
func (src *SimpleRemoteControl) ButtonWasPressed() {
src.slot.Execute()
}
在命令模式中,包括以下几个核心角色:
1. 命令(Command):命令是一个接口或者抽象类,定义了执行操作的方法。它包含一个执行操作的方法(如execute()),并可能包含其他方法来设置命令的接收者。
2. 具体命令(ConcreteCommand):具体命令是命令接口的具体实现,它实现了命令的执行操作。它包含了一个接收者对象,并将具体操作委托给接收者来执行。
3. 接收者(Receiver):接收者是执行命令所代表的操作。任何类都可以充当接收者,只要它能够实现命令的执行操作即可。
4. 调用者/请求者(Invoker/Requester):调用者是包含了具体命令对象的对象。调用者将命令对象作为参数或者通过其它方式传递给具体命令,并在需要的时候触发命令的执行。
5. 客户端(Client):客户端创建具体命令对象,并将其传递给调用者来执行命令。
示例:
// 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()
}
//遥控器
type SimpleRemoteControl struct {
slot Command
}
func (src *SimpleRemoteControl) SetCommand(command Command) {
src.slot = command
}
func (src *SimpleRemoteControl) ButtonWasPressed() {
src.slot.Execute()
}