文章出處

在今天,讀書有時是件“麻煩”事。它需要你付出時間,付出精力,還要付出一份心境。--僅以《大話設計模式》來祭奠那逝去的……

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

1.燒烤店就餐

  燒烤男孩和服務員女孩,開門營業,客戶點餐,女孩記單,客人點完菜,女孩通知男孩開做

  定義燒烤師傅類

    /// <summary>
    /// 烤肉串師傅類
    /// </summary>
    public class Barbecuer
    {
        public void BakeMutton()
        {
            Console.WriteLine("烤羊肉串");
        }

        public void BakeChickenWing()
        {
            Console.WriteLine("烤雞翅");
        }   
    }

   定義抽象命令類和具體命令類

    /// <summary>
    /// 抽象命令
    /// </summary>
    public abstract class Command
    {
        protected Barbecuer receiver;

        public Command(Barbecuer receiver)
        {
            this.receiver = receiver;
        }

        public abstract void ExcuteCommand();
    }

    /// <summary>
    /// 烤肉命令
    /// </summary>
    public class BakeMuttonCommand : Command
    {
        public BakeMuttonCommand(Barbecuer receiver) : base(receiver) { }

        public override void ExcuteCommand()
        {
            receiver.BakeMutton();
        }
    }

    /// <summary>
    /// 烤肉命令
    /// </summary>
    public class BakeChickenWingCommand : Command
    {
        public BakeChickenWingCommand(Barbecuer receiver) : base(receiver) { }

        public override void ExcuteCommand()
        {
            receiver.BakeChickenWing();
        }
    }

   定義服務員類

    /// <summary>
    /// 服務員
    /// </summary>
    public class Waiter
    {
        private IList<Command> orders = new List<Command>();

        /// <summary>
        /// 設置訂單
        /// </summary>
        public void SetOrder(Command command)
        {
            orders.Add(command);
            Console.WriteLine("增加訂單:{0};時間:{1}", command.ToString(), DateTime.Now);
        }

        /// <summary>
        /// 取消訂單
        /// </summary>
        public void CancleOrder(Command command)
        {
            orders.Remove(command);
            Console.WriteLine("取消訂單:{0};時間:{1}", command.ToString(), DateTime.Now);
        }

        /// <summary>
        /// 全部通知
        /// </summary>
        public void Notify()
        {
            foreach (var v in orders)
            {
                v.ExcuteCommand();
            }
        }
    }

   開啟場景模擬

        static void Main(string[] args)
        {
            //燒烤男孩和服務員女孩
            Barbecuer boy = new Barbecuer();
            Waiter girl = new Waiter();

            //開門營業,客戶點餐,女孩記單
            girl.SetOrder(new BakeMuttonCommand(boy));
            girl.SetOrder(new BakeChickenWingCommand(boy));

            //客人點完菜,女孩通知男孩開做
            girl.Notify();
        }

 


文章列表




Avast logo

Avast 防毒軟體已檢查此封電子郵件的病毒。
www.avast.com


arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()