zoukankan      html  css  js  c++  java
  • 设计模式之笔记--命令模式(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();
                }
            }
        }
  • 相关阅读:
    【数据结构第二周】队列知识点整理
    【数据结构第二周】堆栈知识点整理
    【数据结构第二周】线性表知识点整理
    【数据结构第一周】最大子列和问题整理
    网络设置
    QT 安装教程
    C# 复制粘贴板 多行粘贴
    设置网络适配器IP优先级
    MySQL 查重复单号和删重复单号
    Mysql 10053 SocketException 你的主机中的软件中止了一个已建立的连接。
  • 原文地址:https://www.cnblogs.com/zhou-yi/p/5430885.html
Copyright © 2011-2022 走看看