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设计模式之目录 

 

posted @ 2017-09-10 11:42  心存善念  阅读(526)  评论(0编辑  收藏  举报