`

Command设计模式

阅读更多

1、概要

该模式把一个请求或者操作封装到一个对象中。把发出命令和执行命令分隔开,委派给不同的对象。因为把各种命令封装成了一个一个的对象,所以可以灵活地对命令进行管理。比如:Undo和Redo。

 

2、什么时候需要使用Command设计模式?

  • 需要实现Undo/Redo功能的时候
  • 有的系统需要在数据更新的同时,把更新日志记录下来,如果系统崩溃,可以根据日志信息里记录下来的命令,重新执行系统崩溃前做的操作,从而恢复系统崩溃前做的数据更新

3、命令模式涉及到的角色

 

客户(Client)角色:

        ・命令的发出者,把接收者指定给具体命令对象

    ・把具体命令对象指定给Invoker,并通过调用Invoker的接口方法来发出执行命令的请求

请求者(Invoker)角色:

        ・相当于连接客户对象和命令对象之间的桥梁,可以想象成控制电视机的遥控器

        ・负责调用命令对象提供的方法,执行请求

抽象命令(Command)角色:

        ・所有具体命令类的父类,为了使用运行时多态

具体命令(ConcreteCommand)角色:

        ・封装具体命令的类

        ・调用Receiver的方法,执行请求

接收者(Receiver)角色:

        ・请求和操作的实际执行者

 

这五种角色的关系可以理解为上下级关系:

  • 客户是最高级,它负责协调其他角色之间的关系,并发布命令,比如:把接收者委派给具体命令来管理,把具体命令委派给Invoker去管理
  • 请求者管理具体命令,向具体命令发布命令
  • 具体命令管理接收者,并向接收者下达命令
  • 接收者是最低级,它只能接收命令,并执行具体的操作

示例代码:

 

相当于人通过遥控器控制电视机的打开和关闭,并实现了简单的Undo和Redo功能。

每次执行完一个命令的时候,把命令句柄保存起来,Redo的时候,直接调用doCmd.execute方法即可;

Undo的时候,直接调用doCmd的undo方法即可。Redo相对简单一些,因为只要重做前一次的操作即可。

 

public class CommandTest{
 public static void main(String[] args){
  Tvset tv = new Tvset();
  TurnonCommand cmdOn = new TurnonCommand(tv);
  TurnoffCommand cmdOff = new TurnoffCommand(tv);
  RemoteController rc = new RemoteController();
  rc.setCommand(cmdOn,cmdOff);
  rc.turnOn();
  rc.turnOff();
  rc.redo();
  rc.undo();
 } 

}

 

class RemoteController{
 private Command cmdOn;
 private Command cmdOff;
 private Command doCmd;

 public void setCommand(Command cmdOn,Command cmdOff){
  this.cmdOn = cmdOn;
  this.cmdOff = cmdOff;
 }
 
 public void turnOn(){
  cmdOn.execute();
  doCmd=cmdOn;
 }

 public void turnOff(){
  cmdOff.execute();
  doCmd=cmdOff;
 }
 public void redo(){
  System.out.println("Redo start...");
  doCmd.execute();
  System.out.println("Redo end.");
 }
 public void undo(){
  System.out.println("Undo start...");
  doCmd.undo();
  System.out.println("Undo end.");
 }
}

 

 

abstract class Command{
 protected abstract void execute();
 protected abstract void undo();
}

 

 

class TurnonCommand extends Command{
 private Tvset tv;
 public TurnonCommand(Tvset tv){
  this.tv=tv;
 }
 public void execute(){
  tv.turnOn();
 }
 public void undo(){
  tv.turnOff();
 }
}

 

 

class TurnoffCommand extends Command{
 private Tvset tv;
 public TurnoffCommand(Tvset tv){
  this.tv=tv;
 }
 public void execute(){
  tv.turnOff();
 }
 public void undo(){
  tv.turnOn();
 }
}

 

 

class Tvset{
 public void turnOn(){
  System.out.println("Tvset turn on!");
 }

 public void turnOff(){
  System.out.println("Tvset turn off!");
 }
}

 

执行结果:

C:\javastudy>java CommandTest
Tvset turn on!
Tvset turn off!
Redo start...
Tvset turn off!
Redo end.
Undo start...
Tvset turn on!
Undo end.

C:\javastudy>

分享到:
评论

相关推荐

    Command设计模式搭建的框架小例子

    Command设计模式是一种行为设计模式,它将请求封装为一个对象,使得你可以参数化不同请求,对请求排队或者记录请求日志,以及支持可撤销的操作。在.NET开发中,C#语言是实现这种模式的理想选择,因为它提供了丰富的...

    JAVA设计模式chm文档

    创建模式: 设计模式之Factory 设计模式之Prototype(原型) ...设计模式之Command 设计模式之State 设计模式之Strategy(策略) 设计模式之Mediator(中介者) 设计模式之Interpreter(解释器) 设计模式之Visitor

    设计模式文档 chm

    设计模式参考文档 创建模式: 设计模式之Factory 设计模式之Prototype...设计模式之Command 设计模式之State 设计模式之Strategy(策略) 设计模式之Mediator(中介者) 设计模式之Interpreter(解释器) 设计模式之Visitor

    Observer与Command模式在VTK类库设计中的应用研究

    #### 二、Observer/Command设计模式概述 ##### 1. Observer模式 Observer模式是一种行为设计模式,用于定义对象间的依赖关系,以便当一个对象(目标)的状态发生变化时,所有依赖于它的对象(观察者)都会自动收到...

    设计模式-command

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

    Command模式(Java设计模式)

    Command模式是一种行为设计模式,它将请求封装为一个对象,从而使你可用不同的请求对客户进行参数化,对请求排队或记录请求日志,以及支持可撤销的操作。在Java编程中,这种模式被广泛应用于实现命令行操作、GUI事件...

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

    **设计模式之Command(命令)模式** Command模式是一种行为设计模式,它将请求封装为一个对象,使得可以使用不同的请求、队列或者日志请求,同时支持可撤销的操作。这种模式在软件工程中广泛应用于解耦请求的发送者...

    设计模式之Command模式和代码实现

    Command模式是一种行为设计模式,它的主要目的是将命令的发起者(Invoker)与命令的执行者(Receiver)解耦。在Command模式中,一个命令对象封装了特定的请求,调用者(Invoker)只需要知道如何发送命令,而无需知道...

    command 模式的c++实现

    命令模式是一种行为设计模式,它将请求封装为一个对象,使得你可以使用不同的请求、队列或者日志请求,也可以支持可撤销的操作。在C++中实现命令模式,可以有效地解耦调用者和接收者,使系统更加灵活和易于维护。 #...

    C++设计模式代码资源23_Command_命令模式.zip

    **C++设计模式:命令模式** 命令模式是一种行为设计模式,它将请求封装为一个对象,使得你可以使用不同的请求、队列或者记录请求日志,同时支持可撤销的操作。在C++编程中,命令模式是一种非常实用的设计模式,能够...

    Command和Facade设计模式

    在软件设计模式的世界里,`Command`(命令)和`Facade`(外观)模式是非常重要的两种设计模式。它们分别服务于不同的目的,但都是为了提高代码的可读性、可维护性和灵活性。 `Command`模式是一种行为设计模式,它将...

    24种设计模式以及混合设计模式

    设计模式是软件工程中的一种重要思想,它是在特定情境下,为解决常见问题而形成的一套最佳实践。在本文中,我们将深入探讨24种设计模式,并结合混合设计模式的概念,以及它们在实际项目中的应用案例。 首先,设计...

    命令模式(Command模式)

    命令模式是一种行为设计模式,它将请求封装为一个对象,使得我们可以使用不同的请求、队列或者记录请求日志,还可以支持可撤销的操作。在命令模式中,我们创建表示各种操作的类以及能执行这些操作的对象。这种模式的...

    设计模式学习之Command模式共8页.pdf.zip

    Command模式是一种行为设计模式,它将请求封装为一个对象,从而使你可用不同的请求对客户进行参数化,对请求排队或记录请求日志,以及支持可撤销的操作。在软件工程中,这种模式扮演着非常重要的角色,尤其是在需要...

    设计模式之Command

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

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

    命令模式是一种行为设计模式,它将请求封装成独立的对象,使得可以使用不同的请求、队列请求、记录请求历史以及支持可撤销的操作。这种模式在软件工程中被广泛应用,尤其是在需要解耦请求发起者和接收者时,提高了...

    JavaScript设计模式与开发实践.pdf

    由浅入深地讲解了16个设计模式,包括 singleton模式、Factory模式、Abstract Factory模式、Builder模式、Prototype模式、Adapter模式、Bridge模式、Composite模式、Decorator模式、Flyweight模式、Proxy模式、Chain ...

    elixir_command:使用 elixir 完成的 Command 设计模式的 messin

    在Elixir编程中,`Command`设计模式是一种行为设计模式,它封装了对对象的操作,并将其作为命令对象来处理。这种模式通常用于实现命令队列、宏命令或者事务操作。在给定的"elixir_command"项目中,我们可以看到如何...

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

    其中,“Command”(命令)模式是一种行为型设计模式,它允许将请求封装成对象,从而使你能够用不同的请求对客户端进行参数化,对请求进行排队或记录请求日志,以及支持可撤销的操作。 #### 耦合与变化 耦合是指两...

Global site tag (gtag.js) - Google Analytics