Command命令模式

news/2025/4/1 6:17:37/

简介:

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

模式类图:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Sgb9h5FJ-1632108964137)(/img/bVcO3q9)]

command: 抽象的命令类
X_Command、Y_Command、Z_Command: 具体的命令

使用场景:

我现在能想到的一般是在画图软件,办公软件,开发工具(IDE)当中比较常见的,毕竟作为一个码农,复制粘贴用的多了:)

模式实例:

比如我对一串字符串进行一系列的操作,我这个例子可能不太准确,角色划分不太明显,参考:https://www.cnblogs.com/meet/p/5116430.html
https://blog.csdn.net/qq_22764659/article/details/81335701

1、Content被操作的对象

package com.mashibing.command;
public class Content {String msg = "hello everybody ";;
}

2、Command抽象命令

package com.mashibing.command;
public abstract class Command {public abstract void doit();public abstract void undo();
}

3、InsertCommand插入命令:

package com.mashibing.command;
public class InsertCommand extends Command{Content c;String strToInsert="http://www.mashibing.com";public InsertCommand(Content c) {this.c = c;}@Overridepublic void doit() {c.msg = c.msg + strToInsert;}@Overridepublic void undo() {c.msg = c.msg.substring(0,c.msg.length()-strToInsert.length());}
}

4、CopyCommand 复制命令

package com.mashibing.command;
public class CopyCommand extends Command{Content c;public CopyCommand(Content c) {this.c = c;}@Overridepublic void doit() {c.msg = c.msg+c.msg;}@Overridepublic void undo() {c.msg = c.msg.substring(0,c.msg.length()/2);}
}

5、DeleteCommand删除命令

package com.mashibing.command;
public class DeleteCommand extends Command{Content c;String deleted;public DeleteCommand(Content c) {this.c = c;}@Overridepublic void doit() {deleted = c.msg.substring(0,5);c.msg = c.msg.substring(5,c.msg.length());}@Overridepublic void undo() {c.msg = deleted + c.msg;}
}

6、Main 测试

package com.mashibing.command;
import java.util.ArrayList;
import java.util.List;
/*** command模式一般跟责任链模式结合,实现一连串的undo* 也可以用双向链表的方式来做*/
public class Main {public static void main(String[] args) {Content c = new Content();//单个执行命令Command insertCommand = new InsertCommand(c);insertCommand.doit();insertCommand.undo();Command copyCommand = new CopyCommand(c);copyCommand.doit();copyCommand.undo();Command deleteCommand = new DeleteCommand(c);deleteCommand.doit();deleteCommand.undo();System.out.println(c.msg);//串在一起一连串执行List<Command> commands = new ArrayList<>();commands.add(new InsertCommand(c));commands.add(new CopyCommand(c));commands.add(new DeleteCommand(c));for(Command command : commands) {command.doit();}System.out.println(c.msg);//一连串撤回for (int i = commands.size()-1; i >=0; i--){commands.get(i).undo();}System.out.println(c.msg);}
}

测试结果:
在这里插入图片描述


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

相关文章

more command

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

commandos 系列

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

K11375 突击战[Commando War,UVa11729]

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

du command

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

command-codes

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

Command(命令模式)行为型

这命令模式 一、概述二、结构三、实例四、适用场景五、优缺点 一、概述 描述&#xff1a;看电视时&#xff0c;只需要轻轻一按遥控器就能完成频道的切换&#xff0c;这就是命令模式&#xff0c;将换台请求和换台处理完全解耦了。电视机遥控器&#xff08;命令发送者&#xff0…

col command

文章目录 1.命令简介2.命令格式3.选项说明4.常用示例5.相关疑问参考文献 1.命令简介 col&#xff08;control&#xff09;是一个标准输入文本过滤器。 col 从标准输入读取内容&#xff0c;过滤掉控制字符反向换行符&#xff08;RLF-Reverse Line Feed&#xff09;和半反向换行…

Commander基本使用

随着NodeJs的不断发展&#xff0c;对于前端来说要做的东西也就更多&#xff0c;Vue脚手架React脚手架等等等一系列的东西都脱颖而出&#xff0c;进入到人们的视野当中&#xff0c;对于这些脚手架工具来讲也只是停留在应用阶段&#xff0c;从来没有想过脚手架是如何实现的&#…