`

COMMAND(命令) ---- 对象行为型模式

 
阅读更多
1、意图
    将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录日志,以及支持可撤销的操作。
2、别名
    动作(Action),事务(Transaction)
3.动机
    有时必须向某对象提交请求,但并不知道关于被请求的操作或请求的接受者的任何信息。例如,用户界面工具箱包括按钮和菜单这样的对象,它们执行请求响应用户的输入。但工具箱不能显示的在按钮或菜单中实现请求,因为只有使用工具箱的应用知道该由哪个对象做哪个操作。而工具箱的设计者无法知道请求的接受者或执行的操作。
    命令模式通过将请求本身变成一个对象来使工具箱对象可向未指定的应用对象提出请求。这个对象可被存储并向其他的对象一样被传递。这一模式的关键是一个抽象的Command类,它定义了一个执行操作的接口。其最简单的形式是一个抽象的Execute操作。具体的Command子类将接受者作为其一个实例变量,并实现Execute操作,指定接受者采取的动作。而接受者有执行该请求所需的具体信息。


    用Command对象可以很容易的实现菜单(Menu),每一个菜单中的选项都是一个菜单项(MenuItem)的实例。一个Applacation类创建这些菜单和它们的菜单项以及其余的用户界面。该Application类还跟踪用户已经打开的Document对象。
    该应用为每一个菜单项配置一个具体的Command子类的实例。当用户选择了一个菜单项时,该MenuItem对象调用它的Command对象的Execute方法,而Execute执行相应的操作。MenuItem对象并不知道他们使用的是Command的哪一个子类。Command子类存放着请求的接受者,而Execute操作将调用该接受者的一个或多个操作。
    例如,PasteCommand支持从剪贴板向一个文档(Document)粘贴正文。PasteCommand的接受者是一个文档对象,该对象是实例化时提供的。Execute操作将调用该Document的Paste操作。


    而OpenCommand的Execute操作却有所不同:它提示用户输入一个文档名,创建一个相应的文档对象,将其加入作为接受者的应用对象中,并打开该文档。


    有时一个MenuItem需要执行一系列命令。例如,使一个页面按正常大小居中的MenuItem可由一个CenterDocumentCommand对象和一个NormalSizeCommand对象构建。因为这种需将多条命令串联起来的情况很常见,我们定义一个MacroCommand类来让一个MenuItem自行任意数目的命令。MacroCommand是一个具体的Command子类,它接受一个命令序列。MacroCommand没有明确的接受者,而序列中的命令各自定义其接受者。



    请注意这些例子中Command模式是怎样解耦调用的对象和具有执行该操作所需信息的那个对象的。这样我们在设计用户界面时拥有很大的灵活性。一个应用如果想让一个菜单或一个按钮代表同一个功能,只需让他们共享相应Command子类的同一个实例即可。我们还可以动态地替换Command对象,这可用于实现上下文有关的菜单。我们也可通过将几个命令组合形成更强大的命令的形式来支持命令脚本(command scripting)。所有这些之所以成为可能乃是因为提交一个请求的对象仅需知道如何提交它,而不需知道该请求将会被如何执行。
4、适用性
当有以下需求时,可使用Command模式:
1)像上面提到的MenuItem对象那样,抽象出待执行的动作以参数化某对象。你可用过程语言中的回调(callback)函数表达这种参数化机制。所谓回调函数是指函数现在某处注册,而它在需要的时候被调用。Command模式是回调机制的一个面向对象的替代品。
2)在不同的时刻指定、排列和执行请求。一个Command对象可以有一个与初始请求无关的生存期。如果一个请求的接受者可用一种与地址空间无关的方式表达,那么久可将负责该请求的命令对象传给另一个不同的进程并在那儿实现该请求。
3)支持取消操作。Command的Execute操作可在实施操作前将状态存储起来,在取消该操作时这个状态用来取消该操作的影响。Command接口必须添加一个UnExecute操作,该操作取消上一次Execute调用的效果。执行的命令被存储在一个历史列表中。可通过向后和向前遍历这一列表分别调用UnExecute和Execute来实现重数不多的“取消”和“重做”。
4)支持修改日志,这样当系统崩溃时,这些修改可以被重做一遍。在Command接口中添加装载操作和存储操作,可以用来保持变动的一个一致的修改日志。从奔溃中回复的过程包括从磁盘重新读入记录下来的命令并用Execute操作重新执行它们。
5)用构建在原语操作上的高层构造一个系统。这样一种结构在支持事务的信息系统中很常见,一个事务分装了对数据的一组变动。Command模式提供了对事务进行建模的方法。Command有一个公共的接口,使得你可以用同一种方式调用所有的事务。同事使用该模式也易于添加新事务以扩展系统。
5、结构


参与者
Command
----声明执行该操作的接口
ConcreteCommand(PasteCommand,OpenCommand)
----将一个接收者对象绑定与一个动作。
----调用接收者相应的操作,以实现Execute。
Client(Application)
----创建一个具体命令对象并设定它的接收者。
Invoke(MenuItem)
----要求该命令执行这个请求
Receiver(Document,Application)
----知道如何实施与执行一个请求相关的操作。任何类都可能成为一个接收者。
6、示例

/* The Command interface */
public interface Command {
   void execute();
}
 
import java.util.List;
import java.util.ArrayList;
 
/* The Invoker class */
public class Switch {
   private List<Command> history = new ArrayList<Command>();
 
   public Switch() {
   }
 
   public void storeAndExecute(Command cmd) {
      this.history.add(cmd); // optional 
      cmd.execute();        
   }
}
 
/* The Receiver class */
public class Light {
   public Light() {
   }
 
   public void turnOn() {
      System.out.println("The light is on");
   }
 
   public void turnOff() {
      System.out.println("The light is off");
   }
}
 
/* The Command for turning on the light - ConcreteCommand #1 */
public class FlipUpCommand implements Command {
   private Light theLight;
 
   public FlipUpCommand(Light light) {
      this.theLight = light;
   }
 
   public void execute(){
      theLight.turnOn();
   }
}
 
/* The Command for turning off the light - ConcreteCommand #2 */
public class FlipDownCommand implements Command {
   private Light theLight;
 
   public FlipDownCommand(Light light) {
      this.theLight = light;
   }
 
   public void execute() {
      theLight.turnOff();
   }
}
 
/* The test class or client */
public class PressSwitch {
   public static void main(String[] args){
      Light lamp = new Light();
      Command switchUp = new FlipUpCommand(lamp);
      Command switchDown = new FlipDownCommand(lamp);
 
      Switch s = new Switch();
 
      try {
         if (args[0].equalsIgnoreCase("ON")) {
            s.storeAndExecute(switchUp);
         }
         else if (args[0].equalsIgnoreCase("OFF")) {
            s.storeAndExecute(switchDown);
         }
         else {
            System.out.println("Argument \"ON\" or \"OFF\" is required.");
         }
      } catch (Exception e) {
         System.out.println("Arguments required.");
      }
   }
}
  • 大小: 40.4 KB
  • 大小: 29.1 KB
  • 大小: 38.3 KB
  • 大小: 22.2 KB
  • 大小: 39.5 KB
分享到:
评论

相关推荐

    (行为型模式) Command 命令模式

    ### (行为型模式) Command 命令模式 #### 概述 在软件工程领域,设计模式被广泛地应用于解决常见的编程难题。其中,“Command”(命令)模式是一种行为型设计模式,它允许将请求封装成对象,从而使你能够用不同的...

    c++设计模式-行为型模式-命令模式

    c++设计模式-行为型模式-命令模式;qt工程 ;c++简单源码; 命令(Command)模式的定义如下:将一个请求封装为一个对象,使发出请求的责任和执行请求的责任分割开。这样两者之间通过命令对象进行沟通,这样方便将...

    C#面向对象设计模式纵横谈(15):(行为型模式) Command 命令模式 (Level 300)

    命令模式是一种行为设计模式,它将请求封装为一个对象,从而使你可用不同的请求对客户进行参数化,对请求排队或记录请求日志,以及支持可撤销的操作。在C#编程中,这种模式常用于解耦调用者和接收者,提高代码的灵活...

    C#面向对象设计模式纵横谈\15 行为型模式Command命令模式.zip

    在这里与各位分享本人从网络上下载的C#面向对象设计模式纵横谈系列视频,共有25节,除了第一节需要各位贡献一点资源分以作为对本人上传资源的回馈,后面的其他资源均不需要... 这是第15节:行为型模式Command命令模式

    设计模式专题之(十四)命令模式---设计模式命令模式示例代码(python--c++)

    命令模式是一种行为设计模式,它将请求封装为一个对象,从而使你可用不同的请求对客户进行参数化,对请求排队或记录请求日志,以及支持可撤销的操作。在本专题中,我们将深入探讨命令模式,并通过Python和C++两种...

    Command命令模式介绍.docx

    Command命令模式是一种常用的设计模式,属于对象行为型模式之一。它的核心思想在于将请求封装成一个对象,从而让发出请求的对象和执行请求的对象解耦。这种方式有助于实现软件模块之间的低耦合度,并提高了系统的...

    命令模式(Command模式)

    这种模式的核心是将调用者与接收者解耦,使得调用者无需知道接收者的具体实现,只需要通过命令对象进行交互。 **一、模式结构** 1. **命令接口(Command)**:定义命令的接口,声明了一个execute()方法,用于执行...

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

    - 命令模式可能会导致大量小对象的创建,如果内存管理成为问题,可以考虑使用池设计模式或者重构命令对象。 - 在设计命令接口时,应尽量使其简洁,只包含必要的方法,避免增加额外的复杂性。 总之,命令模式是一种...

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

    命令模式(Command Pattern)是一种行为型设计模式,它将请求封装为对象,从而使您可以使用不同的请求、队列请求或日志请求,并支持可撤销操作。命令模式通常用于实现操作的解耦,使得发送者和接收者之间不直接关联...

    Command 命令模式

    1. **Invoker(调用者)**:负责调用命令对象来执行请求。 2. **Command(命令)**:定义了接收者的接口,包含一个或多个执行请求的方法。 3. **Concrete Command(具体命令)**:实现了命令接口,存储了接收者,并...

    [行为型模式]命令模式的理解

    4. **调用者 Invoker**:负责调用命令对象的`execute()`方法来执行命令。 例如,`CommandPattern.cpp`和`CommandPattern.h`文件中可能包含了如下内容: `CommandPattern.h`: ```cpp // 命令接口 class Command { ...

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

    命令模式是一种行为设计模式,它的主要目的是将请求者与接收者解耦,使得请求的发起者无需知道哪个对象会执行这个请求,同时也让系统更容易扩展。这种模式在软件工程中广泛应用,特别是在事件驱动和分布式系统中。 ...

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

    Command模式是一种行为设计模式,它将请求封装为一个对象,使得可以使用不同的请求、队列或者日志请求,同时支持可撤销的操作。这种模式在软件工程中广泛应用于解耦请求的发送者和接收者,使系统更加灵活和易于维护...

    命令模式-面向对象作业东软

    命令模式是一种设计模式,它是面向对象编程中的一种行为模式,主要用来封装操作请求以及相关的执行逻辑,使得请求发送者和接收者解耦。在“命令模式-面向对象作业东软”这个主题中,我们将深入探讨命令模式的核心...

    设计模式-command

    在“设计模式-command”中,我们看到这个模式的应用,通过将一个操作封装为一个对象(即命令对象),使得发送者可以无需知道接收者的具体实现,只需要知道如何发送命令即可。这种松耦合使得系统更易于维护和扩展。 ...

    Go-command-Go命令模式用于线程安全的串行和并行调度程序

    Go语言中的`command`通常指的是命令模式,这是一种行为设计模式,它封装了对象的状态和行为,并将它们作为命令参数传递,使得请求可以被异步执行。在Go这种并发编程非常强大的语言中,命令模式有着广泛的应用,特别...

    设计模式3-行为型模式

    **Command(命令)模式**则是另一种行为模式,它的目的是将行为请求者和行为实现者解耦。在需要记录、撤销或重做行为的场景中,命令模式尤为有用。它将行为封装为独立的对象,使得请求可以被参数化,可以进行队列...

    设计模式C++学习之命令模式(Command)

    在`Demo12_Command`示例中,可能会展示如何创建具体的命令对象,将它们设置到请求者中,然后由请求者调用`execute()`方法来执行命令。这通常涉及到不同类型的命令,如打开文件、保存文件等,这些操作对应于接收者的...

    设计模式----命令模式

    在命令模式的基础上,通过享元模式,可能对某些命令对象进行了复用,降低了内存中的对象数量,提高了系统运行效率。 重构是在不改变代码外在行为的前提下,改善代码的内部结构,使其更易读、易维护。在这个例子中,...

    命令模式command pattern

    命令模式(Command Pattern)是一种行为设计模式,它将请求封装为一个对象,使得你可以使用不同的请求、队列请求,或者支持可撤销的操作。在Java中实现命令模式,我们可以利用面向对象编程的特性来构建系统,使得...

Global site tag (gtag.js) - Google Analytics