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

 

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

热门文章

最新文章

  • 1
    《手把手教你》系列基础篇(九十四)-java+ selenium自动化测试-框架设计基础-POM设计模式实现-下篇(详解教程)
    44
  • 2
    C++一分钟之-C++中的设计模式:单例模式
    51
  • 3
    《手把手教你》系列基础篇(九十三)-java+ selenium自动化测试-框架设计基础-POM设计模式实现-上篇(详解教程)
    36
  • 4
    《手把手教你》系列基础篇(九十二)-java+ selenium自动化测试-框架设计基础-POM设计模式简介(详解教程)
    59
  • 5
    Java面试题:结合设计模式与并发工具包实现高效缓存;多线程与内存管理优化实践;并发框架与设计模式在复杂系统中的应用
    54
  • 6
    Java面试题:设计模式在并发编程中的创新应用,Java内存管理与多线程工具类的综合应用,Java并发工具包与并发框架的创新应用
    39
  • 7
    Java面试题:如何使用设计模式优化多线程环境下的资源管理?Java内存模型与并发工具类的协同工作,描述ForkJoinPool的工作机制,并解释其在并行计算中的优势。如何根据任务特性调整线程池参数
    49
  • 8
    Java面试题:请列举三种常用的设计模式,并分别给出在Java中的应用场景?请分析Java内存管理中的主要问题,并提出相应的优化策略?请简述Java多线程编程中的常见问题,并给出解决方案
    102
  • 9
    Java面试题:设计模式如单例模式、工厂模式、观察者模式等在多线程环境下线程安全问题,Java内存模型定义了线程如何与内存交互,包括原子性、可见性、有序性,并发框架提供了更高层次的并发任务处理能力
    74
  • 10
    Go语言设计模式:使用Option模式简化类的初始化
    71