zoukankan      html  css  js  c++  java
  • Head First设计模式之命令模式

    一、定义

    定义:将一个请求封装成一个对象,从而使您可以用不同的请求对客户进行参数化。对请求排队或记录请求日志,以及支持可撤消的操作。

    主要解决:在软件系统中,行为请求者与行为实现者通常是一种紧耦合的关系,但某些场合,比如需要对行为进行记录、撤销或重做、事务等处理时,这种无法抵御变化的紧耦合的设计就不太合适。

    何时使用:在某些场合,比如要对行为进行"记录、撤销/重做、事务"等处理,这种无法抵御变化的紧耦合是不合适的。在这种情况下,如何将"行为请求者"与"行为实现者"解耦?将一组行为抽象为对象,可以实现二者之间的松耦合。

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

    二、结构

    从命令模式的结构图可以看出,它涉及到五个角色,它们分别是:

    • 客户角色:发出一个具体的命令并确定其接受者。
    • 命令角色:声明了一个给所有具体命令类实现的抽象接口
    • 具体命令角色:定义了一个接受者和行为的弱耦合,负责调用接受者的相应方法。
    • 请求者角色:负责调用命令对象执行命令。
    • 接受者角色:负责具体行为的执行。

    三、适用场景

     认为是命令的地方都可以使用命令模式,比如: 1、GUI 中每一个按钮都是一条命令。 2、模拟 CMD。

    四、优缺点

    优点: 1、降低了系统耦合度。 2、新的命令可以很容易添加到系统中去。

    缺点:使用命令模式可能会导致某些系统有过多的具体命令类。

    五、实现

     /// <summary>  
        /// 电视机  
        /// </summary>  
        public class Television
        {
            /// <summary>  
            /// 模式是关闭的  
            /// </summary>  
            bool isopen = false;
            /// <summary>  
            /// 切换关闭、打开  
            /// </summary>  
            public string Switch()
            {
                if (isopen)
                {
                    isopen = false;
                    return "关闭电视机";
                }
                else
                {
                    isopen = true;
                    return "打开电视机";
    
                }
            }
    
        }
    
        /// <summary>  
        /// 命令接口  
        /// </summary>  
        public interface CommandInterface
        {
            /// <summary>  
            /// 执行命令  
            /// </summary>  
            string Execute();
        }
    
        /// <summary>  
        /// 电视机命令对象  
        /// </summary>  
        public class TeleisionCommand : CommandInterface
        {
            /// <summary>  
            /// 电视机对象  
            /// </summary>  
            private Television Tv = new Television();
            #region CommandInterface 成员  
            /// <summary>  
            /// 执行命令  
            /// </summary>  
            public string Execute()
            {
                return Tv.Switch();
            }
    
            #endregion
        }
    
        /// <summary>  
        /// 控制中心  
        /// </summary>  
        public static class ControlContent
        {
            private static CommandInterface Command;
            public static void SetControlObjectCommand(CommandInterface cobject)
            {
                Command = cobject;
            }
            public static string ExecuteControlObject()
            {
                return Command.Execute();
            }
        }
    
        class Program
        {
            static void Main(string[] args)
            {
                TeleisionCommand tvcommand = new TeleisionCommand();
    
                ControlContent.SetControlObjectCommand(tvcommand);
                Console.WriteLine(ControlContent.ExecuteControlObject());
                Console.WriteLine(ControlContent.ExecuteControlObject());
                Console.ReadLine();
            }
        }

     参考

    http://wangqingpei557.blog.51cto.com/1009349/626464/

    http://www.runoob.com/design-pattern/command-pattern.html

    欢迎阅读本系列文章:Head First设计模式之目录 

  • 相关阅读:
    JavaScript-Runoob-JS 参考手册 :JavaScript 对象
    JavaScript-Runoob-JS 实例 :JavaScript 总结
    JavaScript-Runoob-JS 实例 :JavaScript HTML DOM 实例
    JavaScript-Runoob-JS 实例 :JavaScript Browser 对象实例
    JavaScript-Runoob-JS 实例 :JavaScript 对象实例
    linux 下 php 安装 libevent
    linux 下 php 安装 event
    mybatis实战教程(mybatis in action),mybatis入门到精通
    将MapReduce的结果输出至Mysql数据库
    spring路径通配符
  • 原文地址:https://www.cnblogs.com/xcsn/p/7500623.html
Copyright © 2011-2022 走看看