第十九章 Caché 設計模式 命令模式
定義
命令模式將每個請求封裝成一個對象,從而讓用戶使用不同的請求把客戶端參數化;將請求進行排隊或者記錄請求日誌,以及支持可撤銷操作。
優點
- 行爲請求和行爲實現弱耦合,易擴展,修改,維護。
- 把請求一個操作的對象與知道怎麼執行一個操作的對象分割開。
缺點
設計模式通病,大量衍生類的創建。
作用
- 它較容易地設計一個命令隊列。
- 在需要情況下,可以較容易地將命令計入日誌。
- 允許接收請求的一方決定是否要否決請求。
- 可以容易地實現對請求的撤銷和重做。
- 由於加進新的具體命令類不影響其他的類,因此增加新的具體命令類很容易。
結構圖
描述
去燒烤店吃燒烤,點烤雞翅和羊肉串給廚房下命令。
完整示例
燒烤者
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
烤羊肉串!
烤羊肉串!
烤雞翅!
思考
電視機有 聲音增大,減小,節目增加,減少,四個命令。客戶端調用這四個命令。感興趣的同學寫完可以發我。