命令模式(Command Design Pattern)
命令模式是一种数据驱动的设计模式,属于行为型的模式。它将请求以命令的形式包裹在对象中,并传递给调用对象,调用对象可以用自己的逻辑处理该对象。
代码示例
现在假设你去一家小饭馆吃饭:
- 先让服务员倒一杯水,这里就发出一个倒水的命令:PourWaterCommand,接收对象是服务员
- 然后点了一道菜,让厨师去做,发出一个做饭的命令:CookCommand,接收对象是厨师
- 吃过饭后,你又发出一个结账的命令:CheckoutCommand,接收对象是服务员
package command
import "fmt"
type Command interface {
Execute()
}
//倒咖啡命令
type PourWaterCommand struct {
waiter *Waiter
}
func NewPourWaterCommand(waiter *Waiter) Command {
return &PourWaterCommand{
waiter: waiter,
}
}
func (c *PourWaterCommand) Execute() {
c.waiter.PourWater()
}
//下厨烧饭命令
type CookCommand struct {
chef *Chef
}
func NewCookCommand(chef *Chef) Command {
return &CookCommand{
chef: chef,
}
}
func (c *CookCommand) Execute() {
c.chef.Cook()
}
//结账命令
type CheckoutCommand struct {
waiter *Waiter
}
func NewCheckoutCommand(waiter *Waiter) Command {
return &CheckoutCommand{
waiter: waiter,
}
}
func (c *CheckoutCommand) Execute() {
c.waiter.Checkout()
}
//服务员
type Waiter struct {}
func (w Waiter) PourWater() {
fmt.Println("服务员——倒水")
}
func (w Waiter) Checkout() {
fmt.Println("服务员——计数账单结账")
}
//厨师
type Chef struct {}
func (c Chef) Cook() {
fmt.Println("厨师——烧菜")
}
调用:
waiter := &Waiter{}
cmd := NewPourWaterCommand(waiter)
cmd.Execute()
cmd = NewCookCommand(&Chef{})
cmd.Execute()
cmd = NewCheckoutCommand(waiter)
cmd.Execute()
// Output:
// 服务员——倒咖啡
// 厨师——烧菜
// 服务员——计数账单结账
使用命令模式增加了一堆的Command结构,也增加了系统的复杂度,具体怎么使用还要视情况而定,如果我们的系统已经到了一定的复杂度,现在又要增加一个撤销的操作,那么就可以用命令模式,给每个Command增加一个Undo的函数:
type Command interface {
Execute()
Undo()
}
软件的复杂度是随着需求的增加而增加的,使用命令模式可以减少系统各组件之间的耦合度。