C# 命令模式

C#命令模式  图片来源<设计模式之禅>

 

按上图所示 Receiver是实际干活的实现代码就在这个模块中 , Command 是抽象父类,ConcreteCommand是继承Command的类型 抽象的父类中含有Receiver类 用于子类调用其方法,即子类的Execute就是调用的Receiver中实际代码,Invoker就是为了维护

comand方法 

实际代码如下图

 1     /// <summary>
 2     /// 实现类
 3     /// </summary>
 4     public class Barbecuer
 5     {
 6 
 7         public void BakeMutton()
 8         {
 9 
10             Console.WriteLine("烤羊肉串");
11         }
12 
13         public void BakeChickenWing()
14         {
15 
16             Console.WriteLine("烤鸡翅");
17         }
18     }

实现类即 Receiver 代码 

//实际代码 
public abstract class Command
    {
//实现代码的类
        protected Barbecuer receiver;

        public Command(Barbecuer receiver)
        {
            this.receiver = receiver;
        }
//实现的方法
        abstract public void ExcuteCommand();

    }


    public class BakeChickenWingCommand : Command
    {

        public BakeChickenWingCommand(Barbecuer receiver)
            : base(receiver)
        {


        }

        public override void ExcuteCommand()
        {
            receiver.BakeChickenWing();
        }
    }




    public class BakeMuttonCommand : Command
    {

        public BakeMuttonCommand(Barbecuer receiver)
            : base(receiver)
        {


        }


        public override void ExcuteCommand()
        {
            receiver.BakeMutton();
        }
    }

上面为父类与子类 即Command  ,ConcreteCommand 模块

 

再来就是维护类 用于维护command方法 

 

    public class Waiter
    {
    
        Queue<Command> queue = new Queue<Command>();

        public void SetCommand(Command command)
        {
            queue.Enqueue(command);
        }

      
        public void Notify()
        {

            while (queue.Count > 0)
            {
                Command command = queue.Dequeue();
                command.ExcuteCommand();
            }

        }

    }

 

 

后面调用代码 

 class Program
    {
        static void Main(string[] args)
        {

            //生成维护的类
            Waiter waiter = new Waiter();
            //真正实现代码的类
            Barbecuer barecuer = new Barbecuer();
            //传入到执行类里面去 
            Command commandwing = new BakeChickenWingCommand(barecuer);
            //传入执行的子类 让子类执行代码 
            waiter.SetCommand(commandwing);
            waiter.SetCommand(commandwing);
            waiter.SetCommand(commandwing);
            waiter.Notify();
            Command command = new BakeMuttonCommand(barecuer);
            waiter.SetCommand(command);
            waiter.SetCommand(command);
            waiter.Notify();
            Console.ReadKey();

        }
    }

命令模式 用出就是维护命令的列队,有需要的时候就把命令加入日志,支持撤销与重做 撤销就要在waiter 类 即Invoker模块中进行维护判断是否把command中的某个子类加入到执行列表中

 

posted @ 2017-09-30 15:11  余旺旺  阅读(181)  评论(0编辑  收藏  举报