`
runfeel
  • 浏览: 943642 次
文章分类
社区版块
存档分类
最新评论

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

 
阅读更多

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

分享到:
评论

相关推荐

    design-pattern-java.pdf

    命令模式-Command Pattern 请求发送者与接收者解耦——命令模式(一) 请求发送者与接收者解耦——命令模式(二) 请求发送者与接收者解耦——命令模式(三) 请求发送者与接收者解耦——命令模式(四) 请求发送者...

    c++-设计模式之命令模式(Command Pattern)

    命令模式通过将请求封装为对象,使得请求的发送者和接收者之间解耦。它提供了灵活的操作管理方式,支持可撤销操作、日志记录和宏命令等功能。在这个示例中,命令模式展示了如何通过遥控器对象控制灯的开启和关闭,...

    设计模式之命令模式

    总的来说,命令模式提供了一种方式,使得请求的发送者和接收者之间解耦,同时增强了系统的灵活性和可扩展性。通过这种方式,我们可以更加方便地管理和组织复杂的系统。在实际开发中,特别是在需要实现撤销操作或事务...

    Java设计模式课件命令模式.pptx

    命令模式是一种设计模式,属于对象行为型模式,其主要目的是将请求发送者和接收者解耦,使得两者之间没有直接的引用关系。这种模式通过引入命令对象,将一个请求封装成一个独立的对象,使得发送者只需关注如何发送...

    uml 文档 命令模式

    总结来说,命令模式通过引入命令对象,将请求的发送者与接收者解耦,增强了系统的灵活性和可扩展性。在Struts这样的Web框架中,这种模式使得我们可以更方便地管理和调度请求,同时也便于测试和维护。UML文档对于理解...

    Head First 设计模式 (六) 命令模式(Command pattern) C++实现

    总的来说,命令模式是设计模式中的重要一环,它通过封装请求行为,使得请求发送者和接收者解耦,提高了系统的灵活性和可维护性。在C++中,利用面向对象特性,我们可以方便地实现和应用这一模式。

    [行为模式] head first 设计模式之命令模式(Command)

    命令模式的核心思想是将请求的发送者与接收者解耦。发送者不直接调用接收者的具体方法,而是通过命令对象来调用。这样,发送者和接收者之间就没有直接的依赖关系,可以独立变化。命令模式的关键在于定义一个命令接口...

    java 命令模式实例 (设计模式)

    总结一下,命令模式提供了一种方式来将请求封装为独立的对象,使得请求的发送者和接收者解耦。通过定义命令接口和具体命令类,我们可以轻松地添加新的命令,同时保持系统的灵活性和可扩展性。在Java中,命令模式是...

    设计模式_行为型_命令模式.md

    - 解耦调用者和接收者:命令模式将请求封装为对象,因此调用者不需要直接了解接收者的细节,降低了系统中各部分的耦合度。 - 支持撤销和重做操作:由于命令对象的历史状态可以被保存下来,因此可以实现命令的撤销和...

    设计模式之命令模式(Command Pattern)

    - **松耦合**:调用者与接收者之间的依赖关系被移除,调用者不再需要直接了解接收者的具体实现,只需要知道如何发送请求即可。 - **可扩展性**:添加新的命令只需创建新的具体命令类,不需修改原有系统。 - **可撤销...

    设计模式之命令模式源码示例

    命令模式是一种行为设计模式,它将请求封装为一个对象,从而使你可用不同的请求对客户进行参数化,对请求排队或记录请求日志,以及支持可撤销的操作。在软件工程中,这种模式广泛应用在各种场景中,以提高代码的灵活...

    设计模式-命令模式

    命令模式是一种行为设计模式,它将请求封装为一个对象,从而使你可用不同的请求对客户进行参数化,对请求排队或记录请求日志,以及支持可撤销的操作。在iOS开发中,命令模式尤其适用于处理事件驱动的编程场景,因为...

    命令模式.zip

    在C#编程中,命令模式常用于实现解耦发送者和接收者,提高代码的灵活性和可扩展性。 在"命令模式.zip"这个压缩包中,我们可能会找到以下几个关键部分: 1. **命令接口(Command Interface)**:这是所有具体命令类...

    23种设计模式(10)命令模式Java开发Java经验技巧

    1. **松耦合**:命令模式将请求者与接收者解耦,两者无需直接交互,降低了系统的复杂性。 2. **可扩展性**:添加新命令只需要实现新的具体命令类,无需修改已有代码。 3. **可撤销操作**:可以通过实现undo()方法来...

    设计模式--命令模式java例子

    命令模式的核心是将请求者(Invoker)与执行者(Receiver)解耦,通过引入命令(Command)接口和具体命令(Concrete Command)类来实现。在该模式中,有四个主要角色: 1. **命令(Command)接口**:定义了一个接收...

    设计模式之Command(命令)模式

    1. **解耦**:命令模式将请求发送者与接收者解耦,两者无需直接交互,降低了系统的耦合度。 2. **可扩展性**:容易添加新的命令而不影响现有代码,符合开闭原则。 3. **支持撤销操作**:通过实现命令的`undo()`方法...

    命令模式代码demo

    命令模式的核心思想是解耦调用者(Client)与接收者(Receiver),通过引入命令(Command)接口作为两者之间的桥梁。调用者不再直接调用接收者的具体方法,而是创建一个实现了命令接口的对象,并将该对象传递给接收...

    JAVA责任链与命令模式

    - **解耦**: 请求发送者与接收者之间解耦。 - **可撤销操作**: 支持撤销和重做等复杂操作。 ##### 3.2 实现 下面通过一个简单的例子来了解命令模式的实现。 假设有一个简单的菜单系统,其中包含了一些按钮,每个...

Global site tag (gtag.js) - Google Analytics