1. 程式人生 > 其它 >行為型:三. 命令模式

行為型:三. 命令模式

命令模式是什麼

命令模式是一種行為型設計模式,它可以將一個請求封裝為一個物件,使發出請求的責任和執行請求的責任分割開。這樣兩者之間通過命令物件進行溝通,這樣方便將命令物件進行儲存、傳遞、呼叫、增加與管理。

為什麼用命令模式

在軟體開發系統中,“方法的請求者”與“方法的實現者”之間經常存在緊密的耦合關係,這不利於軟體功能的擴充套件與維護。例如,想對方法進行“撤銷、重做、記錄”等處理都很不方便,因此“如何將方法的請求者與實現者解耦?”變得很重要,命令模式就能很好地解決這個問題。

在現實生活中,命令模式的例子也很多。比如看電視時,我們只需要輕輕一按遙控器就能完成頻道的切換,這就是命令模式,將換臺請求和換臺處理完全解耦了。電視機遙控器(命令傳送者)通過按鈕(具體命令)來遙控電視機(命令接收者)。

命令模式怎麼實現

這裡以生活中電視機遙控器(命令傳送者)通過按鈕(具體命令)來遙控電視機(命令接收者)來舉例。

device.go (電視裝置)
package command

import "fmt"

type device interface {
    on()
    off()
}

type tv struct {
    isRunning bool
}

func (t *tv) on() {
    t.isRunning = true
    fmt.Println("Turning tv on")
}

func (t *tv) off() {
    t.isRunning = false
    fmt.Println("Turning tv off")
}
command.go 命令
package command

type command interface {
    execute()
}

type onCommand struct {
    device device
}

func (c *onCommand) execute() {
    c.device.on()
}


type offCommand struct {
    device device
}

func (c *offCommand) execute() {
    c.device.off()
}
button.go 按鈕
package command

type button struct {
    command command
}

func (b *button) press() {
    b.command.execute()
}

example.go 客戶端呼叫示例
package command

func Example() {
    tv := &tv{}

    onCommand := &onCommand{
        device: tv,
    }

    offCommand := &offCommand{
        device: tv,
    }

    onButton := &button{
        command: onCommand,
    }
    onButton.press()

    offButton := &button{
        command: offCommand,
    }
    offButton.press()
}

優點

  1. 單一職責原則。 你可以解耦觸發和執行操作的類。
  2. 開閉原則。 擴充套件性良好,增加或刪除命令非常方便。採用命令模式增加與刪除命令不會影響其他類。

缺點

  1. 可能產生大量具體的命令類。因為每一個具體操作都需要設計一個具體命令類,這會增加系統的複雜性。