15.命令模式(Command Pattern)

using System;

namespace ConsoleApplication8
{
    class Program
    {
        /// <summary>
        /// 在软件系统中,“行为请求者”与“行为实现者”通常呈现一种“紧耦合”。
        /// 但在某些场合,比如要对行为进行“记录、撤销/重做、事务”等处理,这种无法抵御变化的紧耦合是不合适的。
        /// 在这种情况下,如何将“行为请求者”与“行为实现者”解耦?将一组行为抽象为对象,可以实现二者之间的松耦合[李建忠]。
        /// 这就是本文要说的Command模式。
        /// </summary>
        /// <param name="args"></param>
        static void Main(string[] args)
        {
            Document doc = new Document();
            doc.Display();
            doc.Undo();
            doc.Redo();
            Console.Read();
        }

        /// <summary>
        /// 文档类
        /// </summary>
        public class Document
        {
            /// <summary>
            /// 显示操作
            /// </summary>
            public void Display()
            {
                Console.WriteLine("Display");
            }

            /// <summary>
            /// 撤销操作
            /// </summary>
            public void Undo()
            {
                Console.WriteLine("Undo");
            }

            /// <summary>
            /// 恢复操作
            /// </summary>
            public void Redo()
            {
                Console.WriteLine("Redo");
            }
        }

        /// <summary>
        /// 抽象命令
        /// </summary>
        public abstract class DocumentCommand
        {
            public Document _document;
            public DocumentCommand(Document doc)
            {
                this._document = doc;
            }

            /// <summary>
            /// 执行
            /// </summary>
            public abstract void Execute();
        }

        /// <summary>
        /// 显示命令
        /// </summary>
        public class DisplayCommand : DocumentCommand
        {
            public DisplayCommand(Document doc)
                : base(doc)
            {

            }

            public override void Execute()
            {
                _document.Display();
            }
        }


        /// <summary>
        /// 撤销命令
        /// </summary>
        public class UndoCommand : DocumentCommand
        {
            public UndoCommand(Document doc)
                : base(doc)
            {

            }

            public override void Execute()
            {
                _document.Undo();
            }
        }


        /// <summary>
        /// 重做命令
        /// </summary>
        public class RedoCommand : DocumentCommand
        {
            public RedoCommand(Document doc)
                : base(doc)
            {

            }

            public override void Execute()
            {
                _document.Redo();
            }
        }

        /// <summary>
        /// Invoker角色
        /// </summary>

        public class DocumentInvoker
        {
            DocumentCommand _discmd;
            DocumentCommand _undcmd;
            DocumentCommand _redcmd;

            public DocumentInvoker(DocumentCommand discmd, DocumentCommand undcmd, DocumentCommand redcmd)
            {
                this._discmd = discmd;
                this._undcmd = undcmd;
                this._redcmd = redcmd;
            }

            public void Display()
            {
                _discmd.Execute();
            }

            public void Undo()
            {
                _undcmd.Execute();
            }

            public void Redo()
            {
                _redcmd.Execute();
            }
        }
    }
}
原文地址:https://www.cnblogs.com/lgxlsm/p/4641961.html