首页 > 学院 > 开发设计 > 正文

你程序会做饭嘛?我能!

2019-11-17 02:22:43
字体:
来源:转载
供稿:网友

你程序会做饭嘛?我能!

别嘲笑这个标题。我想了很久。有点“投机取巧”的功效吧!

程序当然不能做饭。

之前的我们的系列文章,介绍, 多线程执行,任务派发。定时器执行。脚本加载。程序状态机。

这些都是零零散散,或者说都是模块化介绍,以及模块测试用例。

那么今天我们就来模拟正常程序流程。使用上述的功能性代码完成流程。

当然今天的测试用例程序肯定和做饭有关。今天要做的是模拟一个餐厅的流程。

完成 客人入座 -> 点菜 -> 等待就餐 -> 就餐 -> 等待结账 -> 结账 -> 离开.

期间包括 等待就餐 添加茶水,就餐的添加茶水,添加米饭等随机事件

新建控制台项目:

Sz.Network.DiningRoom 用于存放主文件项目

类库

Sz.Network.DiningRoom.Scripts 用于存放脚本文件项目

我们先来初始化餐厅。

/** *  * @author 失足程序员 * @Blog http://www.VEVb.com/ty408/ * @mail 492794628@QQ.com * @phone 13882122019 *  */namespace Sz.Network.DiningRoom{    /// <summary>    ///     /// </summary>    public class 餐厅    {        PRivate static 餐厅 instance = new 餐厅();        public static 餐厅 GetInstance { get { return instance; } }        public long 全局线程 = 0;        public long 厨师s = 0;        public long 传菜员s = 0;        public long 服务员s = 0;        public long 配菜员s = 0;        public long 收银员s = 0;        public long 洗菜员s = 0;        public 客人[] table = null;        public void Init(int tableSize)        {            Logger.Info("初始化餐厅");            //所有的工作人员都是一个线程            全局线程 = ThreadPool.ThreadManager.GetInstance.GetThreadModel(new ThreadPool.ThreadModel("全局线程", 1));            //所有的工作人员都是一个线程            厨师s = ThreadPool.ThreadManager.GetInstance.GetThreadModel(new ThreadPool.ThreadModel("厨师", 3));            //所有的工作人员都是一个线程            传菜员s = ThreadPool.ThreadManager.GetInstance.GetThreadModel(new ThreadPool.ThreadModel("传菜员", 5));            //所有的工作人员都是一个线程            服务员s = ThreadPool.ThreadManager.GetInstance.GetThreadModel(new ThreadPool.ThreadModel("服务员", 5));            //所有的工作人员都是一个线程            配菜员s = ThreadPool.ThreadManager.GetInstance.GetThreadModel(new ThreadPool.ThreadModel("配菜员", 3));            //所有的工作人员都是一个线程            收银员s = ThreadPool.ThreadManager.GetInstance.GetThreadModel(new ThreadPool.ThreadModel("收银员", 1));            //所有的工作人员都是一个线程            洗菜员s = ThreadPool.ThreadManager.GetInstance.GetThreadModel(new ThreadPool.ThreadModel("洗菜员", 2));            table = new 客人[tableSize];            for (int i = 0; i < tableSize; i++)            {                Logger.Info("初始化餐桌 " + (i + 1) + " 号桌");            }        }    }}

每一个工作人员都是一个线程。模拟线程。

我们这里,餐厅配置:"厨师", 3"传菜员", 5 "服务员", 5 "配菜员", 3 "收银员", 1 "洗菜员", 2

各个环节的人员都不相同,且每一步操作都不进相同。

接下来我们初始化客人,

/** *  * @author 失足程序员 * @Blog http://www.VEVb.com/ty408/ * @mail 492794628@qq.com * @phone 13882122019 *  */namespace Sz.Network.DiningRoom{    public class 客人    {        public static EnumStatus Status入座 = new EnumStatus(1 << 0, 0x000000);        public static EnumStatus Status取消 = new EnumStatus(1 << 1, 0x000000);        public static EnumStatus Status点菜 = new EnumStatus(1 << 2, 0x000000);        public static EnumStatus Status就餐 = new EnumStatus(1 << 3, 0x000000);        public static EnumStatus Status结账中 = new EnumStatus(1 << 4, 0x000000);        public static EnumStatus Status等待就餐 = new EnumStatus(1 << 5, 0x000000);        public static EnumStatus Status等待结账 = new EnumStatus(1 << 6, 0x000000);        /// <summary>        /// 存储临时数据的        /// </summary>        public ObjectAttribute TempAttribute = new ObjectAttribute();        /// <summary>        /// 客人当前的状态        /// </summary>        public EnumStatus Staus = new EnumStatus(0, 0x000000);        public List<菜肴> 菜肴s = new List<菜肴>();        public int TableID { get; set; }        /// <summary>        /// 每一个客人的随机标识        /// </summary>        public string guidID { get; set; }        public 客人(int tableID)        {            guidID = Guid.NewGuid().ToString().Replace("-", "");            this.TableID = tableID;            Staus |= Status入座;            Show();        }        public void 点菜()        {            ThreadPool.ThreadManager.GetInstance.AddTask(餐厅.GetInstance.服务员s, new Task点菜(this));            Task随机事件发生处理器 task = new Task随机事件发生处理器(this.TableID + " 号桌客人 上碗筷");            ThreadPool.ThreadManager.GetInstance.AddTask(餐厅.GetInstance.服务员s, task);        }        public void Add点菜(菜肴 菜)        {            菜肴s.Add(菜);            ThreadPool.ThreadManager.GetInstance.AddTask(餐厅.GetInstance.洗菜员s, new Task菜(this, 菜));        }        public void Show()        {            string 状态 = "";            if (Staus.HasFlag(Status入座))            {                状态 = "入座";            }            else if (Staus.HasFlag(Status取消))            {                状态 = "取消";            }            else if (Staus.HasFlag(Status点菜))            {                状态 = "点菜";            }            else if (Staus.HasFlag(Status等待就餐))            {                状态 = "等待就餐";            }            else if (Staus.HasFlag(Status就餐))            {                状态 = "就餐";            }            else if (Staus.HasFlag(Status等待结账))            {                状态 = "等待结账";            }            else if (Staus.HasFlag(Status结账中))            {                状态 = "结账中";            }            Logger.Info(this.TableID + " 号桌子 客人 " + this.guidID + " 当前状态:" + 状态);        }    }}

初始化菜肴

/** *  * @author 失足程序员 * @Blog http://www.VEVb.com/ty408/ * @mail 492794628@qq.com * @phone 13882122019 *  */namespace Sz.Network.DiningRoom{    public class 菜肴    {        public static EnumStatus Status点菜 = new EnumStatus(1 << 0, 0x000000);        public static EnumStatus Status取消 = new EnumStatus(1 << 1, 0x000000);        public static EnumStatus Status洗菜 = new EnumStatus(1 << 2, 0x000000);        public static EnumStatus Status配菜 = new EnumStatus(1 << 3, 0x000000);        public static EnumStatus Status炒菜 = new EnumStatus(1 << 4, 0x000000);        public static EnumStatus Status传菜 = new EnumStatus(1 << 5, 0x000000);        public static EnumStatus Status就餐 = new EnumStatus(1 << 6, 0x000000);        public static EnumStatus Status结束就餐 = new EnumStatus(1 << 7, 0x000000);        public string Name { get; private set; }        public EnumStatus Staus = new EnumStatus(0, 0x000000);        /// <summary>        /// 存储临时数据的        /// </summary>        public ObjectAttribute TempAttribute = new ObjectAttribute();        public 菜肴(string name)        {            this.Name = name;            Staus |= Status点菜;            Show();        }        public void Show()        {            string 状态 = "";            if (Staus.HasFlag(Status点菜))            {                状态 = "点菜";            }            else if (Staus.HasFlag(Status取消))            {                状态 = "取消";            }            else if (Staus.HasFlag(Status洗菜))            {                状态 = "洗菜";            }            else if (Staus.HasFlag(Status配菜))            {                状态 = "配菜";            }            else if (Staus.HasFlag(Status炒菜))            {                状态 = "炒菜";            }            else if (Staus.HasFlag(Status传菜))            {                状态 = "传菜";            }            else if (Staus.HasFlag(Status就餐))            {                状态 = "就餐";            }            Logger.Info(this.Name + " 当前状态:" + 状态);        }    }}

我们需要创建一个定时器任务,对餐桌和客人进行状态监测和随机事件发生器

/** *  * @author 失足程序员 * @Blog http://www.VEVb.com/ty408/ * @mail 492794628@qq.com * @phone 13882122019 *  */namespace Sz.Network.DiningRoom{    public class TimerTask : ThreadPool.TimerTask    {        /// <summary>        /// 间隔 5000 毫秒执行一次        /// </summary>        public TimerTask()            : base(餐厅.GetInstance.全局线程, 2000)        {        }        public override void Run()        {                       IEnumerable<IScript餐桌检查器> checkScripts = LoadScriptPool.LoadScriptManager.GetInstance.GetInstances<IScript餐桌检查器>();            foreach (var item in checkScripts)            {                item.Run();            }        }    }}

由于我们餐桌检查器是一个不定数,所以需要放到脚本去。方便更新程序代码。

在脚本项目里面创建脚本文件

/** *  * @author 失足程序员 * @Blog http://www.VEVb.com/ty408/ * @mail 492794628@qq.com * @phone 13882122019 *  */namespace Sz.Netwo
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表