『设计模式』再谈麦当劳的点单模式--命令模式(Command)
生活随笔
收集整理的這篇文章主要介紹了
『设计模式』再谈麦当劳的点单模式--命令模式(Command)
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
23種設計模式+額外常用設計模式匯總 (持續(xù)更新)
麥當勞,我三期設計模式拿你舉例子了,私信聯(lián)系我打錢!!!
概述
- 命令模式又稱為行動(Action) 模式或交易(Transaction) 模式。
- 命令模式把一個請求或者操作封裝到一個對象中。命令模式允許系統(tǒng)使用不同的請求把客戶端參數(shù)化;對請求排隊或者記錄請求日志,可以提供命令的撤銷和恢復功能。
- 命令模式是對命令的封裝。命令模式把命令的責任和執(zhí)行命令的責任分割開,委派給不同的對象。
模式結構
示意性代碼
namespace 命令模式 {class Receiver{public void Action(){Console.WriteLine("操作成功!");}}abstract class Command{protected Receiver receiver;public Command(Receiver receiver){this.receiver = receiver;}abstract public void Execute();}class ConcreteCommand:Command{public ConcreteCommand(Receiver receiver) : base(receiver) { }public override void Execute(){receiver.Action();}}class Invoker{private Command command;public void SetCommand(Command command){this.command = command;}public void ExecuteCommand(){command.Execute();} }class Program{static void Main(string[] args){Receiver r = new Receiver();Command c = new ConcreteCommand(r);Invoker i = new Invoker();i.SetCommand(c);i.ExecuteCommand();Console.Read();}} }- 將請求的接收者(Receiver)放到Command的具體子類ConcreteCommand中,當請求到來時(Invoker發(fā)出Invoker消息激活Command對象),ConcreteCommand將處理請求交給Receiver對象進行處理
- Command模式將調(diào)用操作的對象和知道如何實現(xiàn)該操作的對象解耦。在上面Command的結構圖中,Invoker對象根本就不知道具體的是哪個對象在處理Excute操作。
- 在Command下要增加新的處理操作對象很容易,我們可以通過創(chuàng)建新的繼承自Command的子類來實現(xiàn)這一點。
- Command模式可以和Memento模式結合起來,支持Undo的操作。
使用命令模式情況
- 如果需要在不同的時刻指定、排列和執(zhí)行請求,可以選用命令模式,把這些請求封裝成為命令對象,然后實現(xiàn)把請求隊列化
- 如果需要支持取消操作從可以選用命令模式,通過管理命令對象,,能很容易的實現(xiàn)命令的恢復和重做的功能
- 如果需要支持當系統(tǒng)崩潰時,能把對系統(tǒng)的操作功能重新執(zhí)行一遍,可以選用命令模式,把這些操作功能的請求封裝成命令對象,然后實現(xiàn)日志命令,就可以在系統(tǒng)恢復回來后,通過日志獲取命令列表,從而重新執(zhí)行一遍功能
- 在需要事務的系統(tǒng)中,可以選用命令模式,命令模式提供了對事務進行建模的方法,命令模式有二個別名就是Transaction.
優(yōu)點
命令允許請求的一方和接收請求的一方能夠獨立演化。
- 命令模式使新的命令很容易地被加入到系統(tǒng)里
- 允許接收請求的一方?jīng)Q定是否要否決(Veto) 請求。
- 能較容易地設計一個命令隊列。
- 可以容易地實現(xiàn)對請求的Undo和Redo。
- 在需要的情況下,可以較容易地將命令記入日志。
- 命令模式把請求一個 操作的對象與知道怎么執(zhí)行一個操作的對象分割開。
- 命令類與其他任何別的類-樣,可以修改和推廣。
本質(zhì)
封裝請求。
實例:
麥當勞點單:
炸雞漢堡很香,但請好好吃飯! ?
廚師 命令接收者
命令抽象接口
package Command_McDonald;public abstract class Command {protected Cook cook_receiver;public Command(Cook cook_receiver) {this.cook_receiver = cook_receiver;}abstract public void Excute_Command(); }炸雞命令,具體命令
package Command_McDonald;public class Chicken_Command extends Command {@Overridepublic void Excute_Command() {cook_receiver.Chicken();}public Chicken_Command(Cook cook_receiver) {super(cook_receiver);// TODO Auto-generated constructor stub}} package Command_McDonald;public class Fries_Command extends Command {@Overridepublic void Excute_Command() {cook_receiver.fries();}public Fries_Command(Cook cook_receiver) {super(cook_receiver);// TODO Auto-generated constructor stub}} package Command_McDonald;public class Hamburger_Command extends Command {@Overridepublic void Excute_Command() {cook_receiver.Hamburger();}public Hamburger_Command(Cook cook_receiver) {super(cook_receiver);// TODO Auto-generated constructor stub} }收銀員,命令調(diào)用者
package Command_McDonald;import java.util.ArrayList; import java.util.List;public class Cashier {private List<Command> Command_Undo = new ArrayList<Command>();public void add_Command(Command com) {Command_Undo.add(com); //增加命令}public void Undo_Command(Command com) {Command_Undo.remove(com); //移除命令}public void Notify() // 提交菜單{for(Command con:Command_Undo){con.Excute_Command();//每樣告訴后廚進行制作}} }總結
以上是生活随笔為你收集整理的『设计模式』再谈麦当劳的点单模式--命令模式(Command)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ubuntu如何退出visudo
- 下一篇: 怎么关闭win10自动更新 关闭win1