你程序会做饭嘛?我其实是这样做的

程序当然不能做饭。

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

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

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

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

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

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

新建控制台项目:

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

类库

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

我们先来初始化餐厅。

 
 
  1. /**
  2.  * 
  3.  * @author 失足程序员
  4.  * @Blog http://www.cnblogs.com/ty408/
  5.  * @mail 492794628@qq.com
  6.  * @phone 13882122019
  7.  * 
  8.  */
  9. namespace Sz.Network.DiningRoom
  10. {
  11.     /// 
  12.     /// 
  13.     /// 
  14.     public class 餐厅
  15.     {
  16.         private static 餐厅 instance = new 餐厅();
  17.         public static 餐厅 GetInstance { get { return instance; } }
  18.         public long 全局线程 = 0;
  19.         public long 厨师s = 0;
  20.         public long 传菜员s = 0;
  21.         public long 服务员s = 0;
  22.         public long 配菜员s = 0;
  23.         public long 收银员s = 0;
  24.         public long 洗菜员s = 0;
  25.         public 客人[] table = null;
  26.         public void Init(int tableSize)
  27.         {
  28.             Logger.Info("初始化餐厅");
  29.             //所有的工作人员都是一个线程
  30.             全局线程 = ThreadPool.ThreadManager.GetInstance.GetThreadModel(new ThreadPool.ThreadModel("全局线程", 1));
  31.             //所有的工作人员都是一个线程
  32.             厨师s = ThreadPool.ThreadManager.GetInstance.GetThreadModel(new ThreadPool.ThreadModel("厨师", 3));
  33.             //所有的工作人员都是一个线程
  34.             传菜员s = ThreadPool.ThreadManager.GetInstance.GetThreadModel(new ThreadPool.ThreadModel("传菜员", 5));
  35.             //所有的工作人员都是一个线程
  36.             服务员s = ThreadPool.ThreadManager.GetInstance.GetThreadModel(new ThreadPool.ThreadModel("服务员", 5));
  37.             //所有的工作人员都是一个线程
  38.             配菜员s = ThreadPool.ThreadManager.GetInstance.GetThreadModel(new ThreadPool.ThreadModel("配菜员", 3));
  39.             //所有的工作人员都是一个线程
  40.             收银员s = ThreadPool.ThreadManager.GetInstance.GetThreadModel(new ThreadPool.ThreadModel("收银员", 1));
  41.             //所有的工作人员都是一个线程
  42.             洗菜员s = ThreadPool.ThreadManager.GetInstance.GetThreadModel(new ThreadPool.ThreadModel("洗菜员", 2));
  43.             table = new 客人[tableSize];
  44.             for (int i = 0; i < tableSize; i++)
  45.             {
  46.                 Logger.Info("初始化餐桌 " + (i + 1) + " 号桌");
  47.             }
  48.         }
  49.     }
  50. }

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

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

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

接下来我们初始化客人,

  
 
  1. /**
  2.  * 
  3.  * @author 失足程序员
  4.  * @Blog http://www.cnblogs.com/ty408/
  5.  * @mail 492794628@qq.com
  6.  * @phone 13882122019
  7.  * 
  8.  */
  9. namespace Sz.Network.DiningRoom
  10. {
  11.     public class 客人
  12.     {
  13.         public static EnumStatus Status入座 = new EnumStatus(1 << 0, 0x000000);
  14.         public static EnumStatus Status取消 = new EnumStatus(1 << 1, 0x000000);
  15.         public static EnumStatus Status点菜 = new EnumStatus(1 << 2, 0x000000);
  16.         public static EnumStatus Status就餐 = new EnumStatus(1 << 3, 0x000000);
  17.         public static EnumStatus Status结账中 = new EnumStatus(1 << 4, 0x000000);
  18.         public static EnumStatus Status等待就餐 = new EnumStatus(1 << 5, 0x000000);
  19.         public static EnumStatus Status等待结账 = new EnumStatus(1 << 6, 0x000000);
  20.         /// 
  21.         /// 存储临时数据的
  22.         /// 
  23.         public ObjectAttribute TempAttribute = new ObjectAttribute();
  24.         /// 
  25.         /// 客人当前的状态
  26.         /// 
  27.         public EnumStatus Staus = new EnumStatus(0, 0x000000);
  28.         public List<菜肴> 菜肴s = new List<菜肴>();
  29.         public int TableID { get; set; }
  30.         /// 
  31.         /// 每一个客人的随机标识
  32.         /// 
  33.         public string guidID { get; set; }
  34.         public 客人(int tableID)
  35.         {
  36.             guidID = Guid.NewGuid().ToString().Replace("-", "");
  37.             this.TableID = tableID;
  38.             Staus |= Status入座;
  39.             Show();
  40.         }
  41.         public void 点菜()
  42.         {
  43.             ThreadPool.ThreadManager.GetInstance.AddTask(餐厅.GetInstance.服务员s, new Task点菜(this));
  44.             Task随机事件发生处理器 task = new Task随机事件发生处理器(this.TableID + " 号桌客人 上碗筷");
  45.             ThreadPool.ThreadManager.GetInstance.AddTask(餐厅.GetInstance.服务员s, task);
  46.         }
  47.         public void Add点菜(菜肴 菜)
  48.         {
  49.             菜肴s.Add(菜);
  50.             ThreadPool.ThreadManager.GetInstance.AddTask(餐厅.GetInstance.洗菜员s, new Task菜(this, 菜));
  51.         }
  52.         public void Show()
  53.         {
  54.             string 状态 = "";
  55.             if (Staus.HasFlag(Status入座))
  56.             {
  57.                 状态 = "入座";
  58.             }
  59.             else if (Staus.HasFlag(Status取消))
  60.             {
  61.                 状态 = "取消";
  62.             }
  63.             else if (Staus.HasFlag(Status点菜))
  64.             {
  65.                 状态 = "点菜";
  66.             }
  67.             else if (Staus.HasFlag(Status等待就餐))
  68.             {
  69.                 状态 = "等待就餐";
  70.             }
  71.             else if (Staus.HasFlag(Status就餐))
  72.             {
  73.                 状态 = "就餐";
  74.             }
  75.             else if (Staus.HasFlag(Status等待结账))
  76.             {
  77.                 状态 = "等待结账";
  78.             }
  79.             else if (Staus.HasFlag(Status结账中))
  80.             {
  81.                 状态 = "结账中";
  82.             }
  83.             Logger.Info(this.TableID + " 号桌子 客人 " + this.guidID + " 当前状态:" + 状态);
  84.         }
  85.     }
  86. }

#p#

初始化菜肴

 
 
  1. /**
  2.  * 
  3.  * @author 失足程序员
  4.  * @Blog http://www.cnblogs.com/ty408/
  5.  * @mail 492794628@qq.com
  6.  * @phone 13882122019
  7.  * 
  8.  */
  9. namespace Sz.Network.DiningRoom
  10. {
  11.     public class 菜肴
  12.     {
  13.         public static EnumStatus Status点菜 = new EnumStatus(1 << 0, 0x000000);
  14.         public static EnumStatus Status取消 = new EnumStatus(1 << 1, 0x000000);
  15.         public static EnumStatus Status洗菜 = new EnumStatus(1 << 2, 0x000000);
  16.         public static EnumStatus Status配菜 = new EnumStatus(1 << 3, 0x000000);
  17.         public static EnumStatus Status炒菜 = new EnumStatus(1 << 4, 0x000000);
  18.         public static EnumStatus Status传菜 = new EnumStatus(1 << 5, 0x000000);
  19.         public static EnumStatus Status就餐 = new EnumStatus(1 << 6, 0x000000);
  20.         public static EnumStatus Status结束就餐 = new EnumStatus(1 << 7, 0x000000);
  21.         public string Name { get; private set; }
  22.         public EnumStatus Staus = new EnumStatus(0, 0x000000);
  23.         /// 
  24.         /// 存储临时数据的
  25.         /// 
  26.         public ObjectAttribute TempAttribute = new ObjectAttribute();
  27.         public 菜肴(string name)
  28.         {
  29.             this.Name = name;
  30.             Staus |= Status点菜;
  31.             Show();
  32.         }
  33.         public void Show()
  34.         {
  35.             string 状态 = "";
  36.             if (Staus.HasFlag(Status点菜))
  37.             {
  38.                 状态 = "点菜";
  39.             }
  40.             else if (Staus.HasFlag(Status取消))
  41.             {
  42.                 状态 = "取消";
  43.             }
  44.             else if (Staus.HasFlag(Status洗菜))
  45.             {
  46.                 状态 = "洗菜";
  47.             }
  48.             else if (Staus.HasFlag(Status配菜))
  49.             {
  50.                 状态 = "配菜";
  51.             }
  52.             else if (Staus.HasFlag(Status炒菜))
  53.             {
  54.                 状态 = "炒菜";
  55.             }
  56.             else if (Staus.HasFlag(Status传菜))
  57.             {
  58.                 状态 = "传菜";
  59.             }
  60.             else if (Staus.HasFlag(Status就餐))
  61.             {
  62.                 状态 = "就餐";
  63.             }
  64.             Logger.Info(this.Name + " 当前状态:" + 状态);
  65.         }
  66.     }
  67. }

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

 
 
  1. /**
  2.  * 
  3.  * @author 失足程序员
  4.  * @Blog http://www.cnblogs.com/ty408/
  5.  * @mail 492794628@qq.com
  6.  * @phone 13882122019
  7.  * 
  8.  */
  9. namespace Sz.Network.DiningRoom
  10. {
  11.     public class TimerTask : ThreadPool.TimerTask
  12.     {
  13.         /// 
  14.         /// 间隔 5000 毫秒执行一次
  15.         /// 
  16.         public TimerTask()
  17.             : base(餐厅.GetInstance.全局线程, 2000)
  18.         {
  19.         }
  20.         public override void Run()
  21.         {           
  22.             IEnumerable checkScripts = LoadScriptPool.LoadScriptManager.GetInstance.GetInstances();
  23.             foreach (var item in checkScripts)
  24.             {
  25.                 item.Run();
  26.             }
  27.         }
  28.     }
  29. }

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

#p#

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

 
 
  1. /**
  2.  * 
  3.  * @author 失足程序员
  4.  * @Blog http://www.cnblogs.com/ty408/
  5.  * @mail 492794628@qq.com
  6.  * @phone 13882122019
  7.  * 
  8.  */
  9. namespace Sz.Network.DiningRoom.Scripts
  10. {
  11.     public class Script餐桌检查器 : IScript餐桌检查器
  12.     {
  13.         Random random = new Random(DateTime.Now.Millisecond);
  14.         public Script餐桌检查器()
  15.         {
  16.         }
  17.         public void Run()
  18.         {
  19.             Logger.Info("==================================Script餐桌检查器=======================================");
  20.             for (int i = 0; i < 餐厅.GetInstance.table.Length; i++)
  21.             {
  22.                 if (餐厅.GetInstance.table[i] == null)
  23.                 {
  24.                     int randomValue = random.Next(10000);
  25.                     if (randomValue < 5000)
  26.                     {
  27.                         客人 客 = new 客人(i + 1);
  28.                         餐厅.GetInstance.table[i] = 客;
  29.                     }
  30.                 }
  31.                 else
  32.                 {
  33.                     客人 客 = 餐厅.GetInstance.table[i];
  34.                     if (客.Staus.HasFlag(客人.Status入座))
  35.                     {
  36.                         ///如果客人刚刚入座,执行点菜,移交给服务员
  37.                         客.Staus |= 客人.Status点菜;
  38.                         客.点菜();
  39.                     }
  40.                     else if (客.Staus.HasFlag(客人.Status等待就餐))
  41.                     {
  42.                         bool isFor = true;
  43.                         foreach (var item in 客.菜肴s)
  44.                         {
  45.                             if (!item.Staus.HasFlag(菜肴.Status就餐))
  46.                             {
  47.                                 isFor = false;
  48.                                 break;
  49.                             }
  50.                         }
  51.                         if (isFor)
  52.                         {
  53.                             客.Staus |= 客人.Status就餐;
  54.                             //模拟客人吃饭需要30到50秒
  55.                             客.TempAttribute["Status就餐"] = SzExtensions.CurrentTimeMillis() + (random.Next(3, 6)) * 10 * 1000;
  56.                         }
  57.                         else
  58.                         {
  59.                             //模拟随机事件
  60.                             int randomValue = random.Next(10000);
  61.                             if (randomValue < 6000)
  62.                             {
  63.                                 Logger.Info("随机事件发生 " + (i + 1) + " 号桌客人 添加茶水");
  64.                                 Task随机事件发生处理器 task = new Task随机事件发生处理器((i + 1) + " 号桌客人 添加茶水");
  65.                                 ThreadPool.ThreadManager.GetInstance.AddTask(餐厅.GetInstance.服务员s, task);
  66.                             }
  67.                         }
  68.                     }
  69.                     else if (客.Staus.HasFlag(客人.Status就餐))
  70.                     {
  71.                         if (客.TempAttribute.GetlongValue("Status就餐") < SzExtensions.CurrentTimeMillis())
  72.                         {
  73.                             客.Staus |= 客人.Status等待结账;
  74.                         }
  75.                         else
  76.                         {
  77.                             //模拟随机事件
  78.                             string msg = "";
  79.                             int randomValue = random.Next(10000);
  80.                             if (randomValue < 3000)
  81.                             {
  82.                                 msg = " 添加米饭";
  83.                             }
  84.                             else if (randomValue < 6000)
  85.                             {
  86.                                 msg = " 添加茶水";
  87.                             }
  88.                             if (!string.IsNullOrWhiteSpace(msg))
  89.                             {
  90.                                 Logger.Info("随机事件发生 " + (i + 1) + " 号桌客人 " + msg);
  91.                                 Task随机事件发生处理器 task = new Task随机事件发生处理器((i + 1) + " 号桌客人 " + msg);
  92.                                 ThreadPool.ThreadManager.GetInstance.AddTask(餐厅.GetInstance.服务员s, task);
  93.                             }
  94.                         }
  95.                     }
  96.                     else if (客.Staus.HasFlag(客人.Status等待结账))
  97.                     {
  98.                         客.Staus |= 客人.Status结账中;
  99.                     }
  100.                     else if (客.Staus.HasFlag(客人.Status结账中))
  101.                     {
  102.                         Logger.Info((i + 1) + " 号桌客人 结束就餐 送走客人");
  103.                         餐厅.GetInstance.table[i] = null;
  104.                         return;
  105.                     }
  106.                     客.Show();
  107.                 }
  108.             }
  109.         }
  110.     }
  111. }

点菜也同样为方便程序更新,代码放在脚本执行

 
 
  1. /**
  2.  * 
  3.  * @author 失足程序员
  4.  * @Blog http://www.cnblogs.com/ty408/
  5.  * @mail 492794628@qq.com
  6.  * @phone 13882122019
  7.  * 
  8.  */
  9. namespace Sz.Network.DiningRoom.Scripts
  10. {
  11.     public class Script点菜 : IScript点菜
  12.     {
  13.         public Script点菜()
  14.         {
  15.         }
  16.         public void Run(客人 客)
  17.         {
  18.             List 菜肴_荤菜s = new List() { "回锅肉", "青椒肉丝", "东坡肘子", "糖醋排骨", "鱼香肉丝" };
  19.             List 菜肴_素菜s = new List() { "空心菜", "凤尾", "素炒竹笋", "白油丝瓜" };
  20.             List 菜肴_汤s = new List() { "番茄煎蛋汤", "紫菜蛋花汤", "酸菜粉丝汤", "素菜汤", "肉片汤" };
  21.             Random random = new Random(DateTime.Now.Millisecond);
  22.             {
  23.                 //int 数量 = random.Next(1, 菜肴_荤菜s.Count);
  24.    &n

    分享文章:你程序会做饭嘛?我其实是这样做的
    浏览路径:http://www.hantingmc.com/qtweb/news23/361823.html

    网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等

    广告

    声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联