请求发送者与接收者解耦——命令模式(六)

转载 2013年12月06日 12:27:37

7 宏命令

       宏命令(Macro Command)又称为组合命令,它是组合模式和命令模式联用的产物宏命令是一个具体命令类,它拥有一个集合属性,在该集合中包含了对其他命令对象的引用。通常宏命令不直接与请求接收者交互,而是通过它的成员来调用接收者的方法当调用宏命令的execute()方法时,将递归调用它所包含的每个成员命令的execute()方法,一个宏命令的成员可以是简单命令,还可以继续是宏命令。执行一个宏命令将触发多个具体命令的执行,从而实现对命令的批处理,其结构如图7所示:

7  宏命令结构图

 

8 命令模式总结

       命令模式是一种使用频率非常高的设计模式,它可以将请求发送者与接收者解耦,请求发送者通过命令对象来间接引用请求接收者,使得系统具有更好的灵活性和可扩展性。在基于GUI的软件开发,无论是在电脑桌面应用还是在移动应用中,命令模式都得到了广泛的应用。

 

       1. 主要优点

       命令模式的主要优点如下:

       (1) 降低系统的耦合度。由于请求者与接收者之间不存在直接引用,因此请求者与接收者之间实现完全解耦,相同的请求者可以对应不同的接收者,同样,相同的接收者也可以供不同的请求者使用,两者之间具有良好的独立性。

       (2) 新的命令可以很容易地加入到系统中。由于增加新的具体命令类不会影响到其他类,因此增加新的具体命令类很容易,无须修改原有系统源代码,甚至客户类代码,满足“开闭原则”的要求。

       (3) 可以比较容易地设计一个命令队列或宏命令(组合命令)

       (4) 为请求的撤销(Undo)和恢复(Redo)操作提供了一种设计和实现方案

 

       2. 主要缺点

       命令模式的主要缺点如下:

       使用命令模式可能会导致某些系统有过多的具体命令类。因为针对每一个对请求接收者的调用操作都需要设计一个具体命令类,因此在某些系统中可能需要提供大量的具体命令类,这将影响命令模式的使用。

 

       3. 适用场景

      在以下情况下可以考虑使用命令模式:

       (1) 系统需要将请求调用者和请求接收者解耦,使得调用者和接收者不直接交互。请求调用者无须知道接收者的存在,也无须知道接收者是谁,接收者也无须关心何时被调用。

       (2) 系统需要在不同的时间指定请求、将请求排队和执行请求。一个命令对象和请求的初始调用者可以有不同的生命期,换言之,最初的请求发出者可能已经不在了,而命令对象本身仍然是活动的,可以通过该命令对象去调用请求接收者,而无须关心请求调用者的存在性,可以通过请求日志文件等机制来具体实现。

       (3) 系统需要支持命令的撤销(Undo)操作和恢复(Redo)操作。

       (4) 系统需要将一组操作组合在一起形成宏命令。

微笑

练习

Sunny软件公司欲开发一个基于Windows平台的公告板系统。该系统提供了一个主菜单(Menu),在主菜单中包含了一些菜单项(MenuItem),可以通过Menu类的addMenuItem()方法增加菜单项。菜单项的主要方法是click(),每一个菜单项包含一个抽象命令类,具体命令类包括OpenCommand(打开命令)CreateCommand(新建命令)EditCommand(编辑命令)等,命令类具有一个execute()方法,用于调用公告板系统界面类(BoardScreen)open()create()edit()等方法。试使用命令模式设计该系统,以便降低MenuItem类与BoardScreen类之间的耦合度。

 

【作者:刘伟   http://blog.csdn.net/lovelion

相关文章推荐

请求发送者与接收者解耦——命令模式

转:http://blog.csdn.net/lovelion/article/details/8796736
  • lynchyo
  • lynchyo
  • 2014年08月25日 14:24
  • 387

请求发送者与接收者解耦——命令模式(Command Pattern)

一、前言 对于设计模式的了解是必不可少的,当然对于设计模式的应用那更是重要,可以说是否懂得应用设计模式在项目中是衡量一个程序员的技术水平,因为对于一个功能的实现,高级工程师和初级工程师一样都会实现,...

请求发送者与接收者解耦——命令模式

本文转载自 :http://blog.csdn.net/lovelion/article/details/8796736 装修新房的最后几道工序之一是安装插座和开关,通过开关可以控制...

请求发送者与接收者解耦——命令模式(四)

5 撤销操作的实现       在命令模式中,我们可以通过调用一个命令对象的execute()方法来实现对请求的处理,如果需要撤销(Undo)请求,可通过在命令类中增加一个逆向操作来实现。扩展除了通过...

请求发送者与接收者解耦——命令模式(二)

3 完整解决方案        为了降低功能键与功能处理类之间的耦合度,让用户可以自定义每一个功能键的功能,Sunny软件公司开发人员使用命令模式来设计“自定义功能键”模块,其核心结构如图4所示...

请求发送者与接收者解耦——命令模式(三)

4 命令队列的实现       有时候我们需要将多个请求排队,当一个请求发送者发送一个请求时,将不止一个请求接收者产生响应,这些请求接收者将逐个执行业务方法,完成对请求的处理。此时,我们可以通过命令队...

请求发送者与接收者解耦——命令模式(二)

3 完整解决方案       为了降低功能键与功能处理类之间的耦合度,让用户可以自定义每一个功能键的功能,Sunny软件公司开发人员使用命令模式来设计“自定义功能键”模块,其核心结构如图4所示: 图4...

请求发送者与接收者解耦——命令模式(五)

6 请求日志       请求日志就是将请求的历史记录保存下来,通常以日志文件(Log File)的形式永久存储在计算机中。很多系统都提供了日志文件,例如Windows日志文件、Oracle日志文件等...

C++设计模式10--命令模式(二)(Command)--降低请求发送者与接收者耦合

工作了一天感觉好累,洗了个澡,打开电视看看有没有喜欢的节目,拿起遥控器,看着上面的按钮,忽然感觉好奇妙,我们按一开机键,电视就开了,然后...哈哈,真好玩,我按我按。细想之下这不就是一个命令模式么。 ...
  • gatieme
  • gatieme
  • 2014年01月09日 16:40
  • 18680

C++设计模式10--命令模式(一)--降低请求发送者与接收者耦合

命令模式概述 在软件系统中,“行为请求者”与“行为实现者”通常呈现一种“紧耦合”。但在某些场合,比如要对行为进行“记录、撤销/重做、事务”等处理,这种无法抵御变化的紧耦合是不合适的。在这种情况下,如何...
  • gatieme
  • gatieme
  • 2014年01月09日 16:23
  • 19065
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:请求发送者与接收者解耦——命令模式(六)
举报原因:
原因补充:

(最多只允许输入30个字)