• 设计模式学习笔记——命令模式(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();
            }
        }
    

      

  • 相关阅读:
    Android轻量级的开源缓存框架ASimpleCache
    ESP8266学习笔记6:ESP8266规范wifi连接操作
    javascript——正則表達式
    STL经常使用遍历算法for_each和transform的比較
    OpenGL(八)使用 subroutine 切换可编程管线
    (一二〇)CALayer的一些特性
    Android 5.0 怎样正确启用isLoggable(一)__使用具体解释
    Elasticsearch的javaAPI之query dsl-queries
    kettle使用log4j管理输出日志
    YY博客园UML用例图-活动图-状态图之博客模块
  • 原文地址:https://www.cnblogs.com/ice-baili/p/4710400.html
Copyright © 2020-2023  润新知