Command(命令)

news/2025/3/29 19:34:58/

Command(命令) 行为型 对象 1

Intent_意图2

将“请求”封装成对象,以使用不同的请求、队列或者日志来参数化其他对象。命令模式也支持可撤销的操作

Motivation_动机3

在系统中,行为请求者与行为实现者通常是一种紧耦合的关系,但某些场景下,如需要对行为进行记录、撤销或重做、事务等处理时,这种无法抵御变化的紧耦合的设计其适合性不高

Applicability_适用性4

在某些场合,需要对行为进行“记录、撤销/重做、事务”等处理,在此情况下,将“行为请求者”与“行为实现者”解耦

Structure_结构5

在这里插入图片描述

Participants_参与者6

  • Client(客户) 创建一个具体命令对象并确定其接收者
  • Command(命令) 声明了一个给所有具体命令类的抽象接口
  • ConcreteCommand(具体命令) 命令接口的实现,通常代表一个具体的命令
  • Invoker(请求者) 负责调用命令对象执行请求
  • Receiver(接收者) 负责具体实施和执行一个请求

Collaborations_协作7

  1. Client创建ConcreteCommand对象,并确定Receiver
  2. Command给所有的ConcreteCommand对象,定义抽象接口,声明执行方法(及撤销方法)
    -> 一般定义execute()为执行方法,undo()为撤销方法
  3. ConcreteCommand实现Command接口定义的方法,调用Receiver的相应操作
    -> 实现execute()方法,负责调用接收者的相应操作。execute()方法通常叫做执行方法
  4. Invoker接收并执行Command的执行方法
    -> 相关方法称为action(行动)方法
  5. Receiver具体实施和执行Invoker发出的请求
    -> 任何一个类都可以成为Receiver
    -> 实现和执行请求的方法叫做action(行动)方法

Comsequences_结果8

  • 优点
    降低系统耦合度
    更好的扩展性
    更动态的控制
  • 缺点
    具体命令过于繁复
  • 用途

Implementation/Sample Code_实现/范例代码910

Implementation

Receiver

public class Receiver {// 执行操作的实际方法public void action() {System.out.println("receiver execute");}public void undoAction() {System.out.println("receiver undo");}
}

Command

public interface Command {void execute();	// 执行方法void undo();	// 撤销方法
}

ConcreteCommand

public class ConcreteCommand implements Command {private Receiver receiver;	// 持有的Receiverpublic ConcreteCommand(Receiver receiver) {this.receiver = receiver;}@Overridepublic void execute() {receiver.action();	// 将请求转交Receiver的相应执行方法,交由Receiver执行}@Overridepublic void undo() {receiver.undoAction();	// 将请求转交Receiver的相应撤销方法,交由Receiver执行}
}

Invoker

public class Invoker {private Command command;	// 持有的Command对象// 设置对应的Command对象public void setCommand(Command command) {this.command = command;}// 执行方法public void action() {command.execute();}
}

Client

public class Client {// 创建接收者Receiver receiver = new Receiver();// 创建命令对象,并设置接收者Command command = new ConcreteCommand(receiver);// 创建请求者Invoker invoker = new Invoker();invoker.setCommand(command);	// 设置命令对象invoker.action();	// 执行方法
}

Sample Code

Receiver

public class Light {public void on() {System.out.println("Light is on");}public void off() {System.out.println("Light is off"):}
}

Command

public interface Command {public void execute();public void undo();
}

ConcreteCommand

public class LightOnCommand implements Command {Light light;public LightOnCommand(Light light) {this.light = light;}@Overridepublic void execute() {light.on();}@Overridepublic void undo() {light.off();}
}

Invoker

public class RemoteControl {private Command command;public void setCommand(Command command) {this.command = command;}public void onButtonWasPushed() {command.execute();}public void undoButtonWasPushed() {command.undo();}
}

Client

public class Client {public static void main(String[] args) {Light light = new Light();Command lightOnCommand = new LightOnCommand(light);RemoteControl remoteControl = new RemoteControl();remoteControl.setCommand(lightOnCommand);remoteControl.onButtonWasPushed();remoteControl.undoButtonWasPushed();}
}

Result

Light is on
Light is off

Known Uses_已知应用11

Related Patterns_相关模式12

宏命令
宏命令就是包含多个命令的命令,是一个命令的组合


  1. 模式分类归属 ↩︎

  2. 意图:描述该模式的作用,以及该模式的定义 ↩︎

  3. 动机:给出了问题以及如何解决这个问题的具体场景 ↩︎

  4. 适用性:描述模式可以被应用在什么场合 ↩︎

  5. 结构:提供了图示,显示出参与此模式的类之间的关系 ↩︎

  6. 参与者:描述在此设计中所涉及到的类和对象在模式中的责任和角色 ↩︎

  7. 协作 :告诉参与者如何在此模式中合作 ↩︎

  8. 结果:描述采用此模式之后可能产生的效果,好的与不好的 ↩︎

  9. 实现:提供了在实现该模式时需要使用的技巧,以及应该小心面对的问题 ↩︎

  10. 范例代码:提供代码的片段 ↩︎

  11. 已知应用:用来描述已经在真实系统中发现的模式例子 ↩︎

  12. 相关模式:描述了此模式和其他模式之间的关系 ↩︎


http://www.ppmy.cn/news/906714.html

相关文章

I - Commando War

先读懂题意,先排序,在相加,贪心算法重在思路。 I - Commando War Time Limit:1000MS Memory Limit:0KB 64bit IO Format:%lld & %llu Submit Status Description G Commando War Input: Standard Input Output: Standard …

commands(commands软件)

QQ任逍遥为什么老“badsequenceofcommands”? bad sequence of commands的意思是:命令的次序错误。 WINDOWS动态链接库中文件丢失会造成软件运行参数错误,就会造成你的这个现象。 所以很可能是你的软件运行时参数有问题,电脑提示bad seque…

Command命令模式

简介: 简单来说,就像我们的复制、删除、插入等等都是命令,我们将命令封装为一个对象,并且支持撤销,将一系列命令串成一条链或者与链表结合使用,可以实现一系列的do和undo 模式类图: command: …

more command

文章目录 1.命令简介2.命令格式3.选项说明4.交互式命令5.环境变量6.常用示例参考文献 1.命令简介 more 是常用的文本文件阅读工具。 more 类似于 cat,不过以一页一页的形式显示,便于逐页阅读。一般文件过大时使用 more 浏览,文件较小时使用…

commandos 系列

盟军敢死队1秘籍2008-03-23 12:42 无敌密技:   游戏进行中打GONZO1982或1982GONZO,然后即可使用如下密技:  SHIFTV--追踪  SHIFTX--瞬间移动  CTRLI--无敌  CTRLSHIFTN--完成任务  CtrlShiftX--敌人全爆  选关密码:  MISSION2: 4JJXB …

K11375 突击战[Commando War,UVa11729]

题目描述 你有N个部下,每个部下需要独立完成一项任务。第i个部下需要你花费Bi分钟交代任务,然后他会立刻独立、无间断地执行Ji分钟后完成任务。你需要选择交代任务的顺序,使得所有任务尽早执行完毕(即最后一个执行完的任务应尽早…

du command

文章目录 1.命令简介2.命令格式3.选项说明4.常用示例5.注意事项6.小结参考文献 1.命令简介 du(disk usage)用于查看指定的目录或文件所占用的磁盘空间。 2.命令格式 du [OPTIONS] [FILES] du [OPTIONS] --files0-fromF3.选项说明 -a, --all递归显示目…

command-codes

Hierarchy Commands TPM2_CreatePrimary 此命令用于在主种子之一下创建主对象或在 TPM_RH_NULL 下创建临时对象。 该命令使用 TPM2B_PUBLIC 作为要创建的对象的模板。 不应检查唯一字段的大小是否与其他对象参数一致。 该命令将创建并加载一个主对象。 不返回敏感区域。 注…