zoukankan      html  css  js  c++  java
  • 设计模式学习笔记——命令模式(Command)

    1.特点:将请求发送者与具体实现者解耦,可对请求排列、取消、重做,支持事务。(多请求,单处理)

    2.概念:属于对象的行为模式【GOF95】。命令模式又称为行动(Action)模式或交易(Transaction)模式。命令模式把一个请求或者操作封装到一个对象中。命令模式允许系统使用不同的请求把客户端参数化,对请求排队或者记录请求日志,可以提供命令的撤销和恢复功能。

    3.类图:

    4、程序实现:

    /// <summary>
        /// 接收者类,知道如何实施与执行一个请求相关的操作,任何类都可能作为一个接收者。
        /// </summary>
        public class Receiver
        {
            /// <summary>
            /// 真正的命令实现
            /// </summary>
            public void Action()
            {
                Console.WriteLine("Execute request!");
            }
        }
    
        /// <summary>
        /// 抽象命令类,用来声明执行操作的接口
        /// </summary>
        public interface ICommand
        {
            void Execute();
        }
    
        /// <summary>
        /// 具体命令类,实现具体命令。
        /// </summary>
        public class ConcereteCommand : ICommand
        {
            // 具体命令类包含有一个接收者,将这个接收者对象绑定于一个动作
            private Receiver receiver;
    
            public ConcereteCommand(Receiver receiver)
            {
                this.receiver = receiver;
            }
    
            /// <summary>
            /// 说这个实现是“虚”的,因为它是通过调用接收者相应的操作来实现Execute的
            /// </summary>
            public void Execute()
            {
                receiver.Action();
            }
        }
    
        /// <summary>
        /// 调度类,要求该命令执行这个请求
        /// </summary>
        public class Invoker
        {
            private ICommand command;
    
            /// <summary>
            /// 设置命令
            /// </summary>
            /// <param name="command"></param>
            public void SetCommand(ICommand command)
            {
                this.command = command;
            }
    
            /// <summary>
            /// 执行命令
            /// </summary>
            public void ExecuteCommand()
            {
                command.Execute();
            }
        }

      

    class Program
        {
            static void Main(string[] args)
            {
                Receiver receiver = new Receiver();
                ICommand command = new ConcereteCommand(receiver);
                Invoker invoker = new Invoker();
    
                invoker.SetCommand(command);
                invoker.ExecuteCommand();
    
                Console.Read();
            }
        }
    

      

  • 相关阅读:
    localstorage和sessionstorage的区别
    vue监听数组变化
    博客项目之设计访客统计
    记录从前端到后端--博客项目
    把w3schools英文版的所有属性扒下来了,免费分享。
    记一次博客园改版,如果你想做的漂亮点的话。
    我有话说
    彻底理解nth-child和nth-of-type的区别。
    前端这条路,我们该何去何从,续集
    一篇通俗易懂的CSS层叠顺序与层叠上下文研究
  • 原文地址:https://www.cnblogs.com/ice-baili/p/4710400.html
Copyright © 2011-2022 走看看