设计模式——命令模式

news/2024/10/17 18:38:55/

命令模式

定义

将一个请求封装成一个对象,从而让你使用不同的请求吧客户端参数化,对请求排队或者记录请求日志,可以提供命令的撤销和恢复功能。
命令模式是一个高内聚的模式。

优缺点、应用场景

优点

  1. 类间解耦。调用者与接收者之间没有任何依赖关系。调用者只需要调用execute()方法即可,不需要了解哪个接收者执行。
  2. 可拓展性。
  3. 命令模式结合其他模式会更优秀。例如与责任链模式结合,实现命令族解析任务;结合模板方法模式,可以减少Command子类膨胀问题。

缺点

  1. 类的膨胀问题。如果有N个命令,则子类的数量就为N个,这可能会导致类的膨胀,需要慎重使用。

代码模拟场景

项目组有三个小组需求组、美工组、编码组,客户的每个“命令”都有可能涉及到多个组的响应,使用命令模式一方面接收客户的“命令”,另一方面根据“命令”组合出小组之间的分工。

实验小结

  1. 你永远也不知道用户到底怎么定义他的需求,每次的修改都相当于命令
  2. 如果对于每个命令都需要new来处理,那么每次都需要创建一个场景类,而且是手动的执行命令中的每个细节
  3. 命令模式要求,将一个命令中所有的细节都交给Command的实现类来做,执行命令时由唯一执行人Invoker来执行,而客户的需求只跟Invoker说明,由Invoker发布命令

命令模式

UML图

在这里插入图片描述

部门抽象及部门实体

/*** 抽象组*/
public abstract class Group {// 甲乙双方分开办公,如果要和某个组讨论,首先要找到这个组public abstract void find();// 被要求增加功能public abstract void add();// 被要求删除功能public abstract void delete();// 被要求修改功能public abstract void change();// 被要求给出所有的变更计划public abstract void plan();
}/*** 需求组*/
public class RequirementGroup extends Group {@Overridepublic void find() {System.out.println("找到需求组。。。");}@Overridepublic void add() {System.out.println("客户要求增加一项需求");}@Overridepublic void delete() {System.out.println("客户要求删除一项需求");}@Overridepublic void change() {System.out.println("客户要求修改一项需求");}@Overridepublic void plan() {System.out.println("客户要求需求变更计划");}
}/*** 美工组*/
public class PageGroup extends Group {@Overridepublic void find() {System.out.println("找到美工组。。。");}@Overridepublic void add() {System.out.println("客户要求增加一个页面");}@Overridepublic void delete() {System.out.println("客户要求删除一个页面");}@Overridepublic void change() {System.out.println("客户要求修改一个页面");}@Overridepublic void plan() {System.out.println("客户要求页面变更计划");}
}/*** 代码组*/
public class CodeGroup extends Group {@Overridepublic void find() {System.out.println("找到代码组。。。");}@Overridepublic void add() {System.out.println("客户要求增加一项功能");}@Overridepublic void delete() {System.out.println("客户要求删除一项功能");}@Overridepublic void change() {System.out.println("客户要求修改一项功能");}@Overridepublic void plan() {System.out.println("客户要求代码变更计划");}
}

命令Command抽象与实现

/*** 抽象命令类*/
public abstract class Command {// 定义好三个组,子类可以直接使用protected RequirementGroup requirementGroup = new RequirementGroup();protected PageGroup pageGroup = new PageGroup();protected CodeGroup codeGroup = new CodeGroup();// 只有一个方法:执行public abstract void execute();
}/*** 需求组添加需求的命令*/
public class AddRequirementCommand extends Command {@Overridepublic void execute() {super.requirementGroup.find();super.requirementGroup.add();super.requirementGroup.plan();}
}/*** 需求组添加需求的命令*/
public class DeletePageCommand extends Command {@Overridepublic void execute() {super.pageGroup.find();super.pageGroup.delete();super.pageGroup.plan();}
}

执行人(实施)

/*** 执行者*/
public class Invoker {private Command command;// 客户发出命令public Invoker setCommand(Command command) {this.command = command;// 这个地方自己加的,为了方便设置命令后执行return this;}// 执行客户的命令public void action(){this.command.execute();}
}

入口类

public class CommandMain {public static void main(String[] args) {
//        硬核需求();command();}// 命令模式public static void command(){Invoker<Command> invoker = new Invoker<>();// 添加一个需求Command addRequirementCommand = new AddRequirementCommand();// 设置命令,在这里需要什么命令就直接new一个Command接口的实现类即可Command deletePageCommand = new DeletePageCommand();invoker.setCommand(addRequirementCommand);     // 执行invoker.setCommand(deletePageCommand);invoker.rollback(addRequirementCommand.getClass());     // 客户要求回滚invoker.action();}public static void 硬核需求(){System.out.println("-----客户要求增加一项需求-----");Group requirementGroup = new RequirementGroup();// 找到需求组requirementGroup.find();// 添加需求requirementGroup.add();// 要求变更计划requirementGroup.plan();}
}

结果

非命令模式
在这里插入图片描述

命令模式
在这里插入图片描述

参考书籍

秦小波《设计模式之禅》


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

相关文章

西门子1200四轴程序,FB284伺服v90profinet 程序西门子触摸屏程 序,新能源行业自动排列机,真实项目

西门子1200四轴程序&#xff0c;FB284伺服v90profinet 程序西门子触摸屏程 序&#xff0c;新能源行业自动排列机&#xff0c;真实项目&#xff0c;V90 走PN 口控制4轴&#xff0c;自己写的RFID读写FB SCL和西门子运动控制FB块开放&#xff0c;直接复制可用&#xff0c;没有密码…

Z世代新消费主义:如何把握体验经济的增量新机遇

点击上方蓝字关注我们 如果说被称为“The Net Generation”&#xff08;网络一代&#xff09;的“千禧一代”伴随着互联网的诞生和发展&#xff0c;那么 Z 世代早已能够自然地沐浴在移动互联网的“空气”中。如今&#xff0c;最早出生的 Z 世代已经步入社会、成为青年白领的主…

德国西门子在LED可见光通讯技术方面有了新突破

采用LED可见光作为通讯传输的技术又有了新的突破。德国西门子&#xff08;Siemens&#xff09;近日表示&#xff0c;该公司和德国Heinrich Rudolf 研究所的科学家成功合作&#xff0c;在LED可见光通讯技术上有了更新进一步的突破&#xff0c;让LED可见光通讯传输速率最高可提升…

西门子PLC200smart学习浅谈

针对于PLC200smart的学习我也写了很多文章&#xff0c;发现很多人还是遇到了大量的问题&#xff0c;所以我个人会写一些实时的文章和经验方法分享给大家&#xff0c;方法如下&#xff0c;有需要的可以关注一下。 为了能更高效的沟通我也想过使用群之类的&#xff0c;后来想了想…

强生、默沙东、西门子医疗、赛诺菲、因美纳、BioNTech等公司新动态 | 跨国药企在中国...

一周热点&#xff1a;因美纳与红杉中国在华共推基因组学孵化器。可穿戴式医疗机器人公司Myomo在中国成立合资公司。上药控股与住友制药打造处方药联合营销新模式。百奥赛图与日本LiberoThera达成合作。亚虹医药与Photocure 扩大战略合作。德国BioNTech新冠疫苗在香港获紧急使用…

西门子HMI与西门子变频器G120之间通讯功能实现方法

在实际的工程项目中&#xff0c;用户可以通过操作面板对变频器进行参数设定&#xff0c;参数修改&#xff0c;快速调试等操作。由西门子HMI与西门子变频器G120系列组成的驱动控制系统中&#xff0c;可以实现它们之间的通讯&#xff0c;使得用户可以方便了掌握西门子变频器的参数…

品质+时尚=享乐主义

在家居装饰方面&#xff0c;都市一族喜欢健康美观&#xff0c;简单时尚的风格。三层实木复合地板面板通常选用优质珍贵天然木材&#xff0c;经过径切或弦切而展现不同风格的天然木材纹理&#xff0c;具有独特的色泽、花纹&#xff0c;结构细腻&#xff0c;富于变化&#xff0c;…

聚焦慕思欧洲设计中心,用设计谱写健康睡眠新篇章

4月20日&#xff0c;在意大利米兰&#xff0c;多位欧洲顶尖设计师齐聚ADI博物馆&#xff0c;共同见证“梦享之美”——慕思欧洲设计中心暨设计国际梦之队成立发布会的盛大召开。慕思此次发布会特地选定在米兰国际家具展期间&#xff0c;而这是公认的世界三大家具展之一&#xf…