设计模式之笔记--命令模式(Command)

本文通过一个餐馆点餐的例子,详细介绍了命令模式的概念、组成及应用场景。命令模式能够将请求封装成对象,使请求易于管理和扩展。

命令模式(Command)

定义

      命令模式(Command),将一个请求封闭为一个对象,从而使你可以用不同的请求对客户进行参数化;对请求排除或记录请求日志,以及支持可撤销的操作。

类图

描述

Command:定义命令的统一接口;

ConcreteCommand:Command接口的实现者,要执行的具体命令;

Receiver:命令的实际执行者;

Invoker:命令的请求者,是命令模式中最重要的角色,用来对各个命令进行控制。

应用场景

顾客在餐馆用餐的时候,首先由顾客点餐,服务员记录顾客的点餐情况,然后服务员把订单传到后厨,厨师根据订单把顾客点的餐烹饪好。

    /// <summary>
    /// 厨师
    /// </summary>
    public class Chef
    {
        public void CookBeef()
        {
            Console.WriteLine("大厨开始爆炒牛肉.");
            Console.WriteLine("爆炒牛肉出锅.");
        }

        public void CookFish()
        {
            Console.WriteLine("大厨开始水煮鱼.");
            Console.WriteLine("水煮鱼出锅.");
        }

        public void CookEggplant()
        {
            Console.WriteLine("大厨开始红烧茄子.");
            Console.WriteLine("红烧茄子出锅.");
        }
    }

    public abstract class Command
    {
        public string Name { get; set; }
        public abstract void Cook();
    }

    /// <summary>
    /// 爆炒牛肉
    /// </summary>
    public class CookBeefCommand : Command
    {
        private Chef chef;

        public CookBeefCommand(Chef chef)
        {
            this.chef = chef;
            base.Name = "爆炒牛肉";
        }

        public override void Cook()
        {
            this.chef.CookBeef();
        }
    }

    /// <summary>
    /// 红烧茄子
    /// </summary>
    public class CookEggplantCommand : Command
    {
        private Chef chef;

        public CookEggplantCommand(Chef chef)
        {
            this.chef = chef;
            base.Name = "红烧茄子";
        }

        public override void Cook()
        {
            this.chef.CookEggplant();
        }
    }

    /// <summary>
    /// 水煮鱼
    /// </summary>
    public class CookFishCommand : Command
    {
        private Chef chef;

        public CookFishCommand(Chef chef)
        {
            this.chef = chef;
            base.Name = "水煮鱼";
        }

        public override void Cook()
        {
            this.chef.CookFish();
        }
    }

    /// <summary>
    /// 服务员
    /// </summary>
    public class Waiter
    {
        private List<Command> commands;

        public Waiter()
        {
            this.commands = new List<Command>();
        }

        public void SetOrder(Command command)
        {
            this.commands.Add(command);
            Console.WriteLine("增加订单:" + command.Name);
        }

        public void CancelOrder(Command command)
        {
            this.commands.Remove(command);
            Console.WriteLine("取消订单:" + command.Name);
        }

        public void Notify()
        {
            foreach (Command command in this.commands)
            {
                command.Cook();
            }
        }
    }

 

转载于:https://www.cnblogs.com/zhou-yi/p/5430885.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值