程序当然不能做饭。

之前的我们的系列文章,介绍, 多线程执行,任务派发。定时器执行。脚本加载。程序状态机。
这些都是零零散散,或者说都是模块化介绍,以及模块测试用例。
那么今天我们就来模拟正常程序流程。使用上述的功能性代码完成流程。
当然今天的测试用例程序肯定和做饭有关。今天要做的是模拟一个餐厅的流程。
完成 客人入座 -> 点菜 -> 等待就餐 -> 就餐 -> 等待结账 -> 结账 -> 离开.
期间包括 等待就餐 添加茶水,就餐的添加茶水,添加米饭等随机事件
新建控制台项目:
Sz.Network.DiningRoom 用于存放主文件项目
类库
Sz.Network.DiningRoom.Scripts 用于存放脚本文件项目
我们先来初始化餐厅。
- /**
 - *
 - * @author 失足程序员
 - * @Blog http://www.cnblogs.com/ty408/
 - * @mail 492794628@qq.com
 - * @phone 13882122019
 - *
 - */
 - namespace Sz.Network.DiningRoom
 - {
 - ///
 - ///
 - ///
 - 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.cnblogs.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 ObjectAttribute TempAttribute = new ObjectAttribute();
 - ///
 - /// 客人当前的状态
 - ///
 - public EnumStatus Staus = new EnumStatus(0, 0x000000);
 - public List<菜肴> 菜肴s = new List<菜肴>();
 - public int TableID { get; set; }
 - ///
 - /// 每一个客人的随机标识
 - ///
 - 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 + " 当前状态:" + 状态);
 - }
 - }
 - }
 
#p#
初始化菜肴
- /**
 - *
 - * @author 失足程序员
 - * @Blog http://www.cnblogs.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);
 - ///
 - /// 存储临时数据的
 - ///
 - 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.cnblogs.com/ty408/
 - * @mail 492794628@qq.com
 - * @phone 13882122019
 - *
 - */
 - namespace Sz.Network.DiningRoom
 - {
 - public class TimerTask : ThreadPool.TimerTask
 - {
 - ///
 - /// 间隔 5000 毫秒执行一次
 - ///
 - public TimerTask()
 - : base(餐厅.GetInstance.全局线程, 2000)
 - {
 - }
 - public override void Run()
 - {
 - IEnumerable
 checkScripts = LoadScriptPool.LoadScriptManager.GetInstance.GetInstances (); - foreach (var item in checkScripts)
 - {
 - item.Run();
 - }
 - }
 - }
 - }
 
由于我们餐桌检查器是一个不定数,所以需要放到脚本去。方便更新程序代码。
#p#
在脚本项目里面创建脚本文件
- /**
 - *
 - * @author 失足程序员
 - * @Blog http://www.cnblogs.com/ty408/
 - * @mail 492794628@qq.com
 - * @phone 13882122019
 - *
 - */
 - namespace Sz.Network.DiningRoom.Scripts
 - {
 - public class Script餐桌检查器 : IScript餐桌检查器
 - {
 - Random random = new Random(DateTime.Now.Millisecond);
 - public Script餐桌检查器()
 - {
 - }
 - public void Run()
 - {
 - Logger.Info("==================================Script餐桌检查器=======================================");
 - for (int i = 0; i < 餐厅.GetInstance.table.Length; i++)
 - {
 - if (餐厅.GetInstance.table[i] == null)
 - {
 - int randomValue = random.Next(10000);
 - if (randomValue < 5000)
 - {
 - 客人 客 = new 客人(i + 1);
 - 餐厅.GetInstance.table[i] = 客;
 - }
 - }
 - else
 - {
 - 客人 客 = 餐厅.GetInstance.table[i];
 - if (客.Staus.HasFlag(客人.Status入座))
 - {
 - ///如果客人刚刚入座,执行点菜,移交给服务员
 - 客.Staus |= 客人.Status点菜;
 - 客.点菜();
 - }
 - else if (客.Staus.HasFlag(客人.Status等待就餐))
 - {
 - bool isFor = true;
 - foreach (var item in 客.菜肴s)
 - {
 - if (!item.Staus.HasFlag(菜肴.Status就餐))
 - {
 - isFor = false;
 - break;
 - }
 - }
 - if (isFor)
 - {
 - 客.Staus |= 客人.Status就餐;
 - //模拟客人吃饭需要30到50秒
 - 客.TempAttribute["Status就餐"] = SzExtensions.CurrentTimeMillis() + (random.Next(3, 6)) * 10 * 1000;
 - }
 - else
 - {
 - //模拟随机事件
 - int randomValue = random.Next(10000);
 - if (randomValue < 6000)
 - {
 - Logger.Info("随机事件发生 " + (i + 1) + " 号桌客人 添加茶水");
 - Task随机事件发生处理器 task = new Task随机事件发生处理器((i + 1) + " 号桌客人 添加茶水");
 - ThreadPool.ThreadManager.GetInstance.AddTask(餐厅.GetInstance.服务员s, task);
 - }
 - }
 - }
 - else if (客.Staus.HasFlag(客人.Status就餐))
 - {
 - if (客.TempAttribute.GetlongValue("Status就餐") < SzExtensions.CurrentTimeMillis())
 - {
 - 客.Staus |= 客人.Status等待结账;
 - }
 - else
 - {
 - //模拟随机事件
 - string msg = "";
 - int randomValue = random.Next(10000);
 - if (randomValue < 3000)
 - {
 - msg = " 添加米饭";
 - }
 - else if (randomValue < 6000)
 - {
 - msg = " 添加茶水";
 - }
 - if (!string.IsNullOrWhiteSpace(msg))
 - {
 - Logger.Info("随机事件发生 " + (i + 1) + " 号桌客人 " + msg);
 - Task随机事件发生处理器 task = new Task随机事件发生处理器((i + 1) + " 号桌客人 " + msg);
 - ThreadPool.ThreadManager.GetInstance.AddTask(餐厅.GetInstance.服务员s, task);
 - }
 - }
 - }
 - else if (客.Staus.HasFlag(客人.Status等待结账))
 - {
 - 客.Staus |= 客人.Status结账中;
 - }
 - else if (客.Staus.HasFlag(客人.Status结账中))
 - {
 - Logger.Info((i + 1) + " 号桌客人 结束就餐 送走客人");
 - 餐厅.GetInstance.table[i] = null;
 - return;
 - }
 - 客.Show();
 - }
 - }
 - }
 - }
 - }
 
点菜也同样为方便程序更新,代码放在脚本执行
- /**
 - *
 - * @author 失足程序员
 - * @Blog http://www.cnblogs.com/ty408/
 - * @mail 492794628@qq.com
 - * @phone 13882122019
 - *
 - */
 - namespace Sz.Network.DiningRoom.Scripts
 - {
 - public class Script点菜 : IScript点菜
 - {
 - public Script点菜()
 - {
 - }
 - public void Run(客人 客)
 - {
 - List
 菜肴_荤菜s = new List () { "回锅肉", "青椒肉丝", "东坡肘子", "糖醋排骨", "鱼香肉丝" }; - List
 菜肴_素菜s = new List () { "空心菜", "凤尾", "素炒竹笋", "白油丝瓜" }; - List
 菜肴_汤s = new List () { "番茄煎蛋汤", "紫菜蛋花汤", "酸菜粉丝汤", "素菜汤", "肉片汤" }; - Random random = new Random(DateTime.Now.Millisecond);
 - {
 - //int 数量 = random.Next(1, 菜肴_荤菜s.Count);
 - &n
 
当前标题:你程序会做饭嘛?我其实是这样做的
分享网址:http://cdxtjz.cn/article/cdeioep.html