命令模式(Command Design Pattern)

命令模式是一种数据驱动的设计模式,属于行为型的模式。它将请求以命令的形式包裹在对象中,并传递给调用对象,调用对象可以用自己的逻辑处理该对象。

代码示例

现在假设你去一家小饭馆吃饭:

  1. 先让服务员倒一杯水,这里就发出一个倒水的命令:PourWaterCommand,接收对象是服务员
  2. 然后点了一道菜,让厨师去做,发出一个做饭的命令:CookCommand,接收对象是厨师
  3. 吃过饭后,你又发出一个结账的命令: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()
}

软件的复杂度是随着需求的增加而增加的,使用命令模式可以减少系统各组件之间的耦合度。

results matching ""

    No results matching ""