问题背景
实现烧烤摊场景,引入服务员完成点菜、退单等可撤销的操作。
代码实现
抽象命令类
public abstract class Command
{
protected Barbecuer barbecuer;
public Command(Barbecuer barbecuer)
{
this.barbecuer = barbecuer;
}
public abstract void ExcuteCommand();
}
具体命令实现类
public class BakeMuttonCommand : Command
{
public BakeMuttonCommand(Barbecuer barbecuer) : base(barbecuer)
{
}
public override void ExcuteCommand()
{
barbecuer.BakeMutton();
}
}
public class BakeChickenWingCommand : Command
{
public BakeChickenWingCommand(Barbecuer barbecuer) : base(barbecuer)
{
}
public override void ExcuteCommand()
{
barbecuer.BakeChickenWing();
}
}
执行请求的操作类
public class Barbecuer
{
public void BakeMutton()
{
Console.WriteLine("烤羊肉串");
}
public void BakeChickenWing()
{
Console.WriteLine("烤鸡翅");
}
}
调用命令类
public class Waiter
{
private List<Command> orders = new List<Command>();
public void SetOrder(Command command)
{
if (command is BakeChickenWingCommand)
{
Console.WriteLine("服务员:鸡翅没有了,请点别的烧烤");
}
else
{
orders.Add(command);
Console.WriteLine("增加订单:" + command.ToString() + " 时间:" + DateTime.Now.ToString());
}
}
public void CancelOrder(Command command)
{
orders.Remove(command);
Console.WriteLine("取消订单:" + command.ToString() + " 时间:" + DateTime.Now.ToString());
}
public void Notify()
{
foreach (var order in orders)
{
order.ExcuteCommand();
}
}
}
Main方法
internal class Program
{
static void Main(string[] args)
{
Barbecuer barbecuer = new Barbecuer();
Command bakeMuttonCommand1 = new BakeMuttonCommand(barbecuer);
Command bakeMuttonCommand2 = new BakeMuttonCommand(barbecuer);
Command bakeChickenWingCommand1 = new BakeChickenWingCommand(barbecuer);
Waiter waiter = new Waiter();
waiter.SetOrder(bakeMuttonCommand1);
waiter.SetOrder(bakeMuttonCommand2);
waiter.SetOrder(bakeChickenWingCommand1);
waiter.Notify();
}
}
执行结果
增加订单:命令模式.BakeMuttonCommand 时间:2024/8/3 0:57:11
增加订单:命令模式.BakeMuttonCommand 时间:2024/8/3 0:57:11
服务员:鸡翅没有了,请点别的烧烤
烤羊肉串
烤羊肉串