处理一连串、可能修改撤销的指令时,可以使用命令模式。
演示如下:
代码如下:
internal class Program
{
public static void Run()
{
Waiter waiter = new Waiter();
Command cmd = new Command("鱼香肉丝", 1);
waiter.AddCommand(cmd);
cmd = new Command("大龙虾", 3);
waiter.AddCommand(cmd);
cmd = new Command("米饭", 3);
waiter.AddCommand(cmd);
cmd = new Command("米饭", 2);
waiter.ChangeCommand(cmd);
cmd = new Command("鱼香肉丝", 0);
waiter.DelCommand(cmd);
waiter.FulfilOrder();
}
}
// 点菜单,服务员
// 点菜单 聚合于服务员
public struct Command
{
public Command(string name, int num)
{
Name = name;
Num = num;
}
public string Name;
public int Num;
}
public class Waiter
{
/// <summary>
/// 顾客点菜的的订单。
/// </summary>
private readonly List<Command> order = new List<Command>();
private void Show()
{
Console.Write("当前订单:");
foreach (Command item in order)
{
Console.Write(" " + item.Name + "x" + item.Num);
}
Console.WriteLine();
Console.WriteLine();
}
/// <summary>
/// 点菜
/// </summary>
/// <param name="cmd">点的菜</param>
public void AddCommand(Command cmd)
{
int idx;
idx = order.FindIndex(t => (t.Name == cmd.Name));
if (idx == -1)
{
order.Add(cmd);
}
else
{
order[idx] = cmd;
}
Console.WriteLine("添加:" + cmd.Name + "x" + cmd.Num);
Show();
}
/// <summary>
/// 修改点的菜
/// </summary>
public void ChangeCommand(Command cmd)
{
int idx;
idx = order.FindIndex(t => (t.Name == cmd.Name));
if (idx == -1)
{
throw new Exception("没有点这道菜:" + cmd.Name + ",不能修改");
}
else
{
if (cmd.Num <= 0)
{
order.RemoveAt(idx);
}
else
{
order[idx] = cmd;
}
}
Console.WriteLine("修改:" + cmd.Name + "x" + cmd.Num);
Show();
}
public void DelCommand(Command cmd)
{
int idx;
idx = order.FindIndex(t => (t.Name == cmd.Name));
if (idx == -1)
{
throw new Exception("没有点这道菜:" + cmd.Name + ",不能删除");
}
else
{
order.RemoveAt(idx);
}
Console.WriteLine("删除:" + cmd.Name + "x" + cmd.Num);
Show();
}
public delegate void PassedToChef_delegate(List<Command> order);
public PassedToChef_delegate PassedToChef_Fun;
/// <summary>
/// 完成点单,并将信息传递给厨师
/// </summary>
public void FulfilOrder()
{
PassedToChef_Fun?.Invoke(order);
Console.WriteLine("完成点菜.将订单转交给厨师");
Show();
}
}