中易网

用面向对象模拟 顾客到餐厅就餐的过程. 顾客类 服务员 厨师

答案:2  悬赏:70  
解决时间 2021-03-06 03:29
用c#编写
最佳答案
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApplication15
{
    class Program
    {
        static void Main(string[] args)
        {

            Customer xiaoZhang = new Customer("小张");
            Waiter waiter = new Waiter(xiaoZhang);
            Cook cook = new Cook(waiter);
            xiaoZhang.点菜("红烧大排");
            xiaoZhang.点菜("番茄炒蛋");
            xiaoZhang.点菜("鱼香肉丝");
            xiaoZhang.点完();

            Console.ReadKey();
        }

        public class Customer
        {
            public string Name { get; set; }
            private Waiter waiter;
            public Customer(string name)
            {
                this.Name = name;
                this.waiter = new Waiter(this);
            }

            public void 点菜(string dishName)
            {
                Console.WriteLine(this.Name + "点了:" + dishName);
                this.waiter.记录(dishName);
            }

            public void 点完()
            {
                Console.WriteLine(this.Name + "点完菜了");
                this.waiter.通知厨师();
            }

            public void 吃()
            {
                Console.WriteLine(this.Name + "开吃了!!!");
            }
        }

        public class Waiter
        {
            public List Dishes = new List();
            private Cook cook;
            public Customer Customer { get; set; }

            public Waiter(Customer customer)
            {
                this.Customer = customer;
                this.cook = new Cook(this);              
            }

            public void 记录(string dishName)
            {
                this.Dishes.Add(dishName);
                Console.WriteLine("服务员记下了" + this.Customer.Name + "点的:" + dishName);
            }

            public void 通知厨师()
            {
                Console.WriteLine("服务员通知厨师开始为" + this.Customer.Name + "做菜。");
                this.cook.做菜();
            }

            public void 上菜()
            {
                Console.WriteLine("服务员开始上菜");
                this.Customer.吃();
            }
        }

        public class Cook
        {
            private Waiter waiter;
            public Cook(Waiter waiter)
            {
                this.waiter = waiter;
            }

            public void 做菜()
            {
                foreach (string dish in waiter.Dishes)
                {
                    Console.WriteLine("厨师正在为" + this.waiter.Customer.Name + "做:" + dish);
                }

                this.做完了();
            }

            private void 做完了()
            {
                Console.WriteLine("厨师把" + this.waiter.Customer.Name + "的菜做好了。");
                this.waiter.上菜();
            }
        }
    }
} ---------------------------------------------------------------------
下面的是用命令模式+简单工厂做的:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace 命令模式
{
    class Program
    {
        static void Main(string[] args)
        {
            Cook cook = new Cook();
            Custom xiaoZhang = new Custom("小张");
            Command 点炒菜 = xiaoZhang.点单("点炒菜");
            Command 点饭 = xiaoZhang.点单("点饭");

            Waiter waiter = new Waiter();
            waiter.SetOrder(点炒菜);
            waiter.SetOrder(点饭);
            waiter.Notify();

            Console.ReadKey();
        }
    }

    public class Cook
    {
        public void 炒菜()
        {
            Console.WriteLine("开始炒菜");
        }

        public void 做饭()
        {
            Console.WriteLine("开始做饭");
        }
    }

    public class Custom
    {
        public string Name { get; set; }
        public Custom(string name)
        {
            this.Name = name;
        }

        public Command 点单(string commandString)
        {
            return CommandFactory.CreateCommand(commandString);
        }
    }

    public class CommandFactory
    {
        public static Command CreateCommand(string commandString)
        {
            Cook cook = new Cook();

            if (commandString == "点炒菜")
            {
                return new 炒菜Command(cook);
            }
            else if (commandString == "点饭")
            {
                return new 做饭Command(cook);
            }
            else
            {
                throw new Exception("没这个菜");
            }
        }
    }

    public abstract class Command
    {
        protected Cook cook;

        public Command(Cook cook)
        {
            this.cook = cook;
        }

        public abstract void Execute();
    }

    public class 炒菜Command : Command
    {
        public 炒菜Command(Cook cook) : base(cook) { }

        public override void Execute()
        {
            this.cook.炒菜();
        }
    }

    public class 做饭Command : Command
    {
        public 做饭Command(Cook cook) : base(cook) { }

        public override void Execute()
        {
            this.cook.做饭();
        }
    }

    public class Waiter
    {
        private List commands = new List();
        public void SetOrder(Command command)
        {
            this.commands.Add(command);
        }

        public void Notify()
        {
            foreach (var command in this.commands)
            {
                command.Execute();
            }
        }
    }
}
全部回答
同问。。。
我要举报
如以上问答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
儒塘线地址在哪,我要去那里办事
形容春天的湖水焕发出生机怎么说
上班时间受伤单位把病休算公休怎么办
中国太平洋人寿保险股份有限公司洛南分公司在
惠普m403dw怎样连接wifi
我第一次去泰国应该选择去哪些地方好一些呢?
一个成熟的男人喜欢怎样的女人
有没有新型门禁系统?主要用于写字楼。大家有
新制全职猎人和旧版内容大致一样么
老人过世后医保卡上剩余的钱怎么办
三卜树村这个地址在什么地方,我要处理点事
烟台毓秀小区小高层多钱一平方
古已有之的后半句是什么?
广州地区的天玻或北玻代理有吗? 谢谢
我月经不调 怎么吃地屈孕酮片 如何服用
推荐资讯
大家认为sfc模拟器哪个版本最好
果树上化肥多了怎么办?
怎样申请成都市龙泉驿区体彩销售点
沈阳哪有卖或者租动漫COSPLAY服装假发的动漫
寇氏中医专业减肥在哪里啊,我有事要去这个地
燃气热水器 没有任何反映
推荐几部类似《死亡诗社》的励志电影吧!谢谢
上海星智贸易有限公司我想知道这个在什么地方
克拉玛依少儿活动中心就是少年宫吗
8剪五分之二等于多少
续写《我的叔叔于勒》于勒的心理描写
朋友说去一家。国家自己的银行交3800打入一个
手机登qq时,显示手机磁盘不足,清理后重新登
刺客的套装怎么选啊?