第十九章 Caché 設計模式 命令模式

第十九章 Caché 設計模式 命令模式

定義

命令模式將每個請求封裝成一個對象,從而讓用戶使用不同的請求把客戶端參數化;將請求進行排隊或者記錄請求日誌,以及支持可撤銷操作。

優點

  • 行爲請求和行爲實現弱耦合,易擴展,修改,維護。
  • 把請求一個操作的對象與知道怎麼執行一個操作的對象分割開。

缺點

設計模式通病,大量衍生類的創建。

作用

  • 它較容易地設計一個命令隊列。
  • 在需要情況下,可以較容易地將命令計入日誌。
  • 允許接收請求的一方決定是否要否決請求。
  • 可以容易地實現對請求的撤銷和重做。
  • 由於加進新的具體命令類不影響其他的類,因此增加新的具體命令類很容易。

結構圖

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-uIvQUBD5-1588033892623)(2E88C8BDBE4440C09AB4020D91F6BD0C)]

描述

去燒烤店吃燒烤,點烤雞翅和羊肉串給廚房下命令。

完整示例

燒烤者

Class PHA.YX.Design.Command.Barbecuer Extends %RegisteredObject
{

Method BakeMutton()
{
	w "烤羊肉串!",!
}

Method BakeChickenWing()
{
	w "烤雞翅!",!
}

}

抽象命令

Class PHA.YX.Design.Command.Command Extends %RegisteredObject
{

Property receiver As Barbecuer [ Private ];

Method %OnNew(receiver As Barbecuer) As %Status [ Private, ServerOnly = 1 ]
{
	s ..receiver = receiver
	Quit $$$OK
}

Method ExcuteCommand() [ Abstract ]
{
}

}

具體命令

Class PHA.YX.Design.Command.BakeMuttonCommand Extends Command
{

Method %OnNew(receiver As Barbecuer) As %Status [ Private, ServerOnly = 1 ]
{
	d ##super(receiver)
	Quit $$$OK
}

Method ExcuteCommand()
{
	d ..receiver.BakeMutton()
}

}

Class PHA.YX.Design.Command.BakeChickenWingCommand Extends Command
{

Method %OnNew(receiver As Barbecuer) As %Status [ Private, ServerOnly = 1 ]
{
	d ##super(receiver)
	Quit $$$OK
}

Method ExcuteCommand()
{
	d ..receiver.BakeChickenWing()
}

}

服務員

Class PHA.YX.Design.Command.Waiter Extends %RegisteredObject
{

Property orders As list Of Command [ Private ];

Method SetOrder(command As Command)
{
	d ..orders.Insert(command)
	w "增加訂單" _ command.%ClassName() _ "時間" _ $zd($h,3) _ " " _ $zt($p($h, ",", "2"),1),!
}

Method CancelOrder(command As Command)
{
	d ..orders.RemoveAt(command)
	w "取消訂單" _ command.%ClassName() _ "時間" _ $zd($h,3) _ " " _ $zt($p($h, ",", "2"),1),!
}

Method Notify()
{
	f i = 1 : 1 : ..orders.Count() d
	.d ..orders.GetAt(i).ExcuteCommand()
}

}

調用

/// d ##class(PHA.YX.Design.Program).Command() 
ClassMethod Command()
{
	#dim boy as PHA.YX.Design.Command.Barbecuer
	s boy = ##class(PHA.YX.Design.Command.Barbecuer).%New()
	s bakeMuttonCommand1 = ##class(PHA.YX.Design.Command.BakeMuttonCommand).%New(boy)
	s bakeMuttonCommand2 = ##class(PHA.YX.Design.Command.BakeMuttonCommand).%New(boy)
	s bakeChickenWingCommand1 = ##class(PHA.YX.Design.Command.BakeChickenWingCommand).%New(boy)
	
	#dim girl as PHA.YX.Design.Command.Waiter
	s girl = ##class(PHA.YX.Design.Command.Waiter).%New()
	d girl.SetOrder(bakeMuttonCommand1)
	d girl.SetOrder(bakeMuttonCommand1)
	d girl.CancelOrder(bakeMuttonCommand1)
	d girl.SetOrder(bakeChickenWingCommand1)
	
	d girl.Notify()
}
DHC-APP>d ##class(PHA.YX.Design.Program).Command()
增加訂單BakeMuttonCommand時間2020-04-07 09:43:56
增加訂單BakeMuttonCommand時間2020-04-07 09:43:56
取消訂單BakeMuttonCommand時間2020-04-07 09:43:56
增加訂單BakeChickenWingCommand時間2020-04-07 09:43:56
烤羊肉串!
烤羊肉串!
烤雞翅!
 

思考

電視機有 聲音增大,減小,節目增加,減少,四個命令。客戶端調用這四個命令。感興趣的同學寫完可以發我。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章