设计模式---命令模式

命令模式:

           命令模式 (Command),将一个请求封装为一个对象,从而是你可用不同的请求对客户进行参数化,对请求排队或记录请求日志,以及支持可撤销的操作。


结构图



Invoker类 ,要求该命令执行这个请求

Command类,用来声明执行操作的接口

ConcreteCommand类,将一个接受者对象绑定于一个动作,调用接受者相应的操作,以实现Execute。

Receiver类,知道如何实施与执行一个请求相关的操作,任何类都可能作为一个接收者。


作用:

  • 优点

    1,能够溶胶地设计一个命令队列。

    2,在需要的情况下,可以较容易地将命令记入日志。

    3,允许接受请求的一方决定是否要否决请求。

  •    何时使用?

           如果不清楚一个系统是否需要命令模式,一般情况下不要着急去实现它,事实上,在需要的时候通过重构实现这个模式并不困难,只有在真正需要如撤销/回复操作等功能呢时, 把原来的代码重构为命令模式才有意义。


实例

举例说明---吃烤羊肉串


烧烤摊 VS 烧烤店

在烧烤摊上,因为要吃烤肉的人田铎,而且每个人都希望最快迟到肉串,而烤肉的老板只有一个人,来的人一多 ,就未必记得住谁交过钱,谁要多少串,需不需要辣椒等等,容易造成混乱

而在烧烤店中如果需要对这些混乱做记录,而且在店中,我们不需要认识烤肉的是谁,只需要给接待的服务员说我们要什么就好,让他给我们的请求做记录,然后再由他通知烤肉师傅,,所有的客户都有一份订单,烤肉师傅可以按先后顺序操作,不会混乱也不会遗忘,收钱的时候也不会多收少收,如果点多了可以撤销,直接让服务员划掉就好了。

这就是让变成融入生活


class Program
    {
        static void Main(string[] args)
        {
            //开店前的准备
            Barbecuer boy = new Barbecuer();
            Command bakeMuttonCommand1 = new BakeMuttonCommand(boy);
            Command bakeMuttonCommand2 = new BakeMuttonCommand(boy);
            Command bakeChickenWingCommand1=new BakeChickenWingCommand (boy);
            Waiter girl1 = new Waiter();

            //开门营业 顾客点菜
            girl1.SetOrder(bakeMuttonCommand1 );
            girl1 .SetOrder (bakeMuttonCommand2 );
            girl1.SetOrder(bakeChickenWingCommand1 );

            //点菜完毕,通知厨房
            girl1.Notify();
            Console.Read();
        }
    }
    //抽象命令类
    public abstract class Command
    {
        protected Barbecuer receiver;
        //抽象命令类,只需确定烤肉串者是谁
        public Command(Barbecuer receiver)
        {
            this.receiver = receiver;
        }
        //执行命令
        abstract public void ExcuteCommand();
    }
    //烤肉串的实现
    public class Barbecuer
    {
        //烤羊肉
       public void BakeMutton()
    {
        Console.WriteLine("烤羊肉串!");
    }
        //烤鸡翅
        public void BackChickenWing()
        {
          Console.WriteLine("烤鸡翅!");
        }

    }
    //具体命令类
    //烤肉串命令
    class BakeMuttonCommand : Command
    {
        public BakeMuttonCommand(Barbecuer receiver)
            : base(receiver)
        { }
        public override void ExcuteCommand()//具体命令类,执行命令时,执行具体的行为
        {
            receiver.BakeMutton();
        }
    }
    //烤鸡翅命令
    class BakeChickenWingCommand : Command
    {
        public BakeChickenWingCommand(Barbecuer receiver) : base(receiver )
        { 
        }
        public override void ExcuteCommand()
        {
            receiver.BackChickenWing();
        }
    }
    //服务员类
    //服务员
    public class Waiter
    { 
       private IList <Command >orders=new List <Command >();//增加存放具体命令的容器
        //设置订单
       public void SetOrder(Command command)
       {
           //在客户提出请求时,对没货的烧烤进行回绝
           if (command .ToString ()=="命令模式.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 (Command cmd in orders )
           {
               cmd.ExcuteCommand();
           }
       }
    }




评论 33
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值