设计模式--命令(Command)模式
生活随笔
收集整理的這篇文章主要介紹了
设计模式--命令(Command)模式
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
模式定義
將一個請求(行為)封裝為一個對象,從而使你可用不同的請求對客戶進行參數化,對請求排隊或記錄請求日志,以及支持可撤銷的操作
類圖
要點總結
- Command模式的根本目的在于將“行為請求者”與“行為實現者”解耦,在面向對象語言中,常見的實現手段是“將行為抽象為對象”
- 實現Command接口的具體命令對象ConcreteCommand有時候根據需要可能會保存一些額外的狀態信息,通過使用Composite模式,可以將多個“命令”封裝為一個“復合命令”MacroCommand
Go語言代碼實現
工程目錄
command.go
package Commandimport "fmt"type Person struct {name stringcmd Command }type Command struct {person *Personmethod func() }func NewCommand (p *Person, method func()) Command {return Command{person: p,method: method,} }func (c *Command) Execute(){c.method() }func NewPerson (name string, cmd Command) Person{return Person{name: name,cmd: cmd,} }func (p *Person) Buy() {fmt.Println(fmt.Sprintf("%s is buying ", p.name))p.cmd.Execute() }func (p *Person) Cook() {fmt.Println(fmt.Sprintf("%s is cooking ", p.name))p.cmd.Execute() }func (p *Person) Wash() {fmt.Println(fmt.Sprintf("%s is washing ", p.name))p.cmd.Execute() }func (p *Person) Listen() {fmt.Println(fmt.Sprintf("%s is listening ", p.name))p.cmd.Execute() }func (p *Person) Talk() {fmt.Println(fmt.Sprintf("%s is talking ", p.name))p.cmd.Execute() }command_test.go
package Commandimport "testing"func TestCommand_Execute(t *testing.T) {laowang := NewPerson("wang", NewCommand(nil, nil))laozhang := NewPerson("zhang", NewCommand(&laowang, laowang.Listen))laofeng := NewPerson("feng", NewCommand(&laozhang, laozhang.Buy))laoding := NewPerson("ding", NewCommand(&laofeng, laofeng.Cook))laoli := NewPerson("li", NewCommand(&laoding, laoding.Wash))laoli.Talk() }總結
以上是生活随笔為你收集整理的设计模式--命令(Command)模式的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 设计模式--责任链(Responsibi
- 下一篇: 设计模式--访问器(Visitor)模式