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

 

相关文章
|
3月前
|
设计模式 存储 算法
Java设计模式-命令模式(16)
Java设计模式-命令模式(16)
|
4月前
|
设计模式 存储 Java
【十二】设计模式~~~行为型模式~~~命令模式(Java)
文章详细介绍了命令模式(Command Pattern),这是一种对象行为型模式,用于将请求封装成对象,实现请求发送者与接收者的解耦,从而降低系统耦合度、提高灵活性,并支持命令的排队、记录、撤销和恢复操作。通过案例分析、结构图、时序图和代码示例,文章展示了命令模式的组成部分、实现方式和应用场景,并讨论了其优点、缺点和适用情况。
|
5月前
|
设计模式 JavaScript API
js设计模式【详解】—— 命令模式
js设计模式【详解】—— 命令模式
47 6
|
5月前
|
设计模式 Java
Head First设计模式学习笔记
Head First设计模式学习笔记
|
6月前
|
设计模式
命令模式-大话设计模式
命令模式-大话设计模式
|
6月前
|
设计模式 Java uml
必知的技术知识:JAVA【设计模式】命令模式
必知的技术知识:JAVA【设计模式】命令模式
30 0
|
6月前
|
设计模式 Java
Java设计模式之命令模式详解
Java设计模式之命令模式详解
|
6月前
|
设计模式
设计模式之命令模式
设计模式之命令模式
|
7月前
|
设计模式 Java 调度
【设计模式系列笔记】命令模式
命令模式是一种行为设计模式,它将请求封装成一个对象,从而允许使用不同的请求、队列或日志请求参数化客户端对象,同时支持撤销操作。
73 1
|
7月前
|
设计模式 存储 Java
【搞懂设计模式】命令模式:从遥控器到编程的妙用!
【搞懂设计模式】命令模式:从遥控器到编程的妙用!
78 0