命令模式

命令模式旨在将"行为请求者"与"行为实现者"解耦

如何解决:通过调用者调用接受者执行命令,顺序:调用者→接受者→命令。

 关键代码:定义三个角色:1、received 真正的命令执行对象 2、Command 3、invoker 使用命令对象的入口

需要基本使用类,抽象命令与具体命令,通过中介者调用命令指向实用类的方法。

   #region 基本使用类
    public class Document
    {
        //具体操作
        public void Display()
        {
            Console.WriteLine("具体操作");
        }
        public void Undo()
        {
            Console.WriteLine("撤销");
        }
        public void Redo()
        {
            Console.WriteLine("恢复");
        }
    }
    #endregion
  #region 抽象命令
    public abstract class DocumentCommand
    {
        protected Document _document;
        public DocumentCommand(Document document)
        {
            this._document = document;
        }
        public abstract void Execute();
    }
    #endregion
 #region 具体命令类
    public class DisplayCommand : DocumentCommand
    {
        public DisplayCommand(Document document) : base(document)
        {
        }
        public override void Execute()
        {
            _document.Display();
        }
    }
    public class UndoCommand : DocumentCommand
    {
        public UndoCommand(Document document) : base(document)
        {
        }
        public override void Execute()
        {
            _document.Undo();
        }
    }
    public class RedoCommand : DocumentCommand
    {
        public RedoCommand(Document document) : base(document)
        {
        }
        public override void Execute()
        {
            _document.Redo();
        }
    }
    #endregion
 #region 调用者
    public class DocumentInvoker
    {
        List<DocumentCommand> list = new List<DocumentCommand>();
        public DocumentInvoker(params DocumentCommand[] documentcommands)
        {
            foreach (DocumentCommand item in documentcommands)
            {
                list.Add(item);
            }
        }
        public void Execute()
        {
            foreach (DocumentCommand item in list)
            {
                item.Execute();
            }
        }

    }
    #endregion
 static void Main(string[] args)
        {
            Document doc=new Document();//使用类的实例
            DocumentCommand d1 = new DisplayCommand(doc);//命令类1
            UndoCommand d2 = new UndoCommand(doc);////命令类1

            DocumentInvoker di = new DocumentInvoker(d1,d2);//将这两个命令传给调用者
            di.Execute();
            Console.ReadKey();
        }

 

基本类正常书写,命令类中内部有使用类,通过方法实现调用使用类的方法,调用者通过调用命令类,触发内部方法,从而触发基本类的方法!

(这种类内部有另一个类的私有成员,很常见了,要牢记!!!)

原文地址:https://www.cnblogs.com/ningxinjie/p/12194861.html