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设计模式是一种行为设计模式,它将请求封装为一个对象,使得你可以参数化不同请求,对请求排队或者记录请求日志,以及支持可撤销的操作。在.NET开发中,C#语言是实现这种模式的理想选择,因为它提供了丰富的...
创建模式: 设计模式之Factory 设计模式之Prototype(原型) ...设计模式之Command 设计模式之State 设计模式之Strategy(策略) 设计模式之Mediator(中介者) 设计模式之Interpreter(解释器) 设计模式之Visitor
设计模式参考文档 创建模式: 设计模式之Factory 设计模式之Prototype...设计模式之Command 设计模式之State 设计模式之Strategy(策略) 设计模式之Mediator(中介者) 设计模式之Interpreter(解释器) 设计模式之Visitor
#### 二、Observer/Command设计模式概述 ##### 1. Observer模式 Observer模式是一种行为设计模式,用于定义对象间的依赖关系,以便当一个对象(目标)的状态发生变化时,所有依赖于它的对象(观察者)都会自动收到...
在“设计模式-command”中,我们看到这个模式的应用,通过将一个操作封装为一个对象(即命令对象),使得发送者可以无需知道接收者的具体实现,只需要知道如何发送命令即可。这种松耦合使得系统更易于维护和扩展。 ...
Command模式是一种行为设计模式,它将请求封装为一个对象,从而使你可用不同的请求对客户进行参数化,对请求排队或记录请求日志,以及支持可撤销的操作。在Java编程中,这种模式被广泛应用于实现命令行操作、GUI事件...
**设计模式之Command(命令)模式** Command模式是一种行为设计模式,它将请求封装为一个对象,使得可以使用不同的请求、队列或者日志请求,同时支持可撤销的操作。这种模式在软件工程中广泛应用于解耦请求的发送者...
Command模式是一种行为设计模式,它的主要目的是将命令的发起者(Invoker)与命令的执行者(Receiver)解耦。在Command模式中,一个命令对象封装了特定的请求,调用者(Invoker)只需要知道如何发送命令,而无需知道...
命令模式是一种行为设计模式,它将请求封装为一个对象,使得你可以使用不同的请求、队列或者日志请求,也可以支持可撤销的操作。在C++中实现命令模式,可以有效地解耦调用者和接收者,使系统更加灵活和易于维护。 #...
**C++设计模式:命令模式** 命令模式是一种行为设计模式,它将请求封装为一个对象,使得你可以使用不同的请求、队列或者记录请求日志,同时支持可撤销的操作。在C++编程中,命令模式是一种非常实用的设计模式,能够...
在软件设计模式的世界里,`Command`(命令)和`Facade`(外观)模式是非常重要的两种设计模式。它们分别服务于不同的目的,但都是为了提高代码的可读性、可维护性和灵活性。 `Command`模式是一种行为设计模式,它将...
设计模式是软件工程中的一种重要思想,它是在特定情境下,为解决常见问题而形成的一套最佳实践。在本文中,我们将深入探讨24种设计模式,并结合混合设计模式的概念,以及它们在实际项目中的应用案例。 首先,设计...
命令模式是一种行为设计模式,它将请求封装为一个对象,使得我们可以使用不同的请求、队列或者记录请求日志,还可以支持可撤销的操作。在命令模式中,我们创建表示各种操作的类以及能执行这些操作的对象。这种模式的...
Command模式是一种行为设计模式,它将请求封装为一个对象,从而使你可用不同的请求对客户进行参数化,对请求排队或记录请求日志,以及支持可撤销的操作。在软件工程中,这种模式扮演着非常重要的角色,尤其是在需要...
Command模式是一种行为设计模式,它将请求封装为一个对象,从而使你可用不同的请求对客户进行参数化,对请求排队或记录请求日志,以及支持可撤销的操作。在Java编程中,这种模式常用于解耦调用者和接收者,使得系统...
命令模式是一种行为设计模式,它将请求封装成独立的对象,使得可以使用不同的请求、队列请求、记录请求历史以及支持可撤销的操作。这种模式在软件工程中被广泛应用,尤其是在需要解耦请求发起者和接收者时,提高了...
由浅入深地讲解了16个设计模式,包括 singleton模式、Factory模式、Abstract Factory模式、Builder模式、Prototype模式、Adapter模式、Bridge模式、Composite模式、Decorator模式、Flyweight模式、Proxy模式、Chain ...
在Elixir编程中,`Command`设计模式是一种行为设计模式,它封装了对对象的操作,并将其作为命令对象来处理。这种模式通常用于实现命令队列、宏命令或者事务操作。在给定的"elixir_command"项目中,我们可以看到如何...
其中,“Command”(命令)模式是一种行为型设计模式,它允许将请求封装成对象,从而使你能够用不同的请求对客户端进行参数化,对请求进行排队或记录请求日志,以及支持可撤销的操作。 #### 耦合与变化 耦合是指两...