Administrator
发布于 2024-08-03 / 26 阅读
0
0

命令模式

问题背景

实现烧烤摊场景,引入服务员完成点菜、退单等可撤销的操作。

代码实现

抽象命令类

    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
服务员:鸡翅没有了,请点别的烧烤
烤羊肉串
烤羊肉串

UML图


评论