Java设计模式(18)之命令模式

article/2025/10/19 18:16:15

命令模式

将“请求”封装成对象,以便使用不同的请求、队列或者日志来参数化其他对象。命令模式也支持可撤销的操作。命令模式通过这种封装的方式实现将客户端和接收端解耦。

类型:

行为型模式(类与类之间的行为型模式)

命令模式的几个角色:

  • 抽象命令接口Command:定义命令的接口,声明执行的方法。
  • 具体的命令对象ConcreteCommand:持有具体的接受者对象,完成具体的具体的命令。
  • 接受者对象Receiver:接受者对象,真正执行命令的对象。
  • 传递命令对象Invoker:持有命令对象,要求命令对象执行请求。
  • 客户端对象Client:创建具体命令的对象并且设置命令对象的接受者。

命令模式关系图:

这里写图片描述

命令模式示例:

本例子是呼叫小爱同学帮你开灯的例子,你对小爱同学说:小爱同学帮我打开灯,然后小爱同学让灯自己打开了。

抽象命令接口Command:

/*** Create by zhaihongwei on 2018/3/30* 抽象的命令接口,定义具体命名的接口*/
public interface Command {/*** 执行命名的接口*/void execute();
}

具体的命令对象ConcreteCommand:(开灯命令,关灯命令)

/*** Create by zhaihongwei on 2018/3/30* 开灯命令*/
public class LightOnCommand implements Command{private Light light;/*** 创建开灯命令的时候,传入具体的灯对象,由灯对象操作自己* @param light*/public LightOnCommand(Light light) {this.light = light;}@Override/*** 具体的灯对象调用自己的开灯方法*/public void execute() {light.lightOn();}
}
/*** Create by zhaihongwei on 2018/3/30* 关灯命令*/
public class LightOffCommand implements Command{private Light light;/*** 创建关灯命令的时候,传入具体的灯对象,由灯对象操作自己* @param light*/public LightOffCommand(Light light) {this.light = light;}@Override/*** 具体的灯对象调用自己的关灯方法*/public void execute() {light.lightOff();}
}

传递命令对象Invoker:

/*** Create by zhaihongwei on 2018/3/30* 小爱同学*/
public class XiaoAi {private Command command;/*** 设置具体的命令* @param command*/public void setCommand(Command command) {this.command = command;}/*** 执行命令*/public void doCommand() {command.execute();}
}

接受者对象Receiver:

/*** Create by zhaihongwei on 2018/3/30* 具体的电灯类*/
public class Light {/*** 开灯方法*/public void lightOn() {System.out.println("灯打开了!!");}/*** 关灯方法*/public void lightOff() {System.out.println("灯关上了!!");}
}

客户端对象:

/*** Create by zhaihongwei on 2018/3/30* 客户端对象*/
public class Client {public static void main(String[] args) {// 创建小爱同学XiaoAi xiaoAi = new XiaoAi();// 创建具体的等对象,相当于具体的命令接受者Light light = new Light();// 创建了开灯的命令,你就是命令的发起者System.out.println("小爱同学帮我把灯开一下!");LightOnCommand lightOnCommand = new LightOnCommand(light);// 小爱同学接受到了你发出的命令,并执行命令xiaoAi.setCommand(lightOnCommand);xiaoAi.doCommand();System.out.println("-------------------------------------------------");System.out.println("小爱同学帮我关一下灯!");LightOffCommand lightOffCommand = new LightOffCommand(light);xiaoAi.setCommand(lightOffCommand);xiaoAi.doCommand();}
}

测试结果:

小爱同学帮我把灯开一下!
灯打开了!!
-------------------------------------------------
小爱同学帮我关一下灯!
灯关上了!!

总结:

上面的例子仅仅是实现单个命令的的命令模式,而命令模式是可以相当复杂的,就比如说,你让小爱同学帮你打开灯,并且帮你打开电视,并且打开空调等等,这时候我们可以将多个命令存储起来,然后一次性执行。

关于NoCommand的理解:

在没有设置具体的命令的时候将命令存储中的对象都设置成NoCommand的,这样做可以避免空指针异常,具体作用体现可以阅读《Head First》 。

关于宏命令的理解:

将多个命令存储起来,发出执行宏命令请求的之后执行存储的所有命令。

关于命令撤销的理解:

在我们发出某个请求并执行之后,将命令的执行状态进行保存,如果我们想要回归执行这个命令之前的状态,我们就可以通过命令撤销的方式回归到之前的状态。

命令模式的优缺点:

优点:

  • 实现客户端和接受者之间的解耦。
  • 可以动态的添加新的命令。
  • 只需要调用同一个方法(doCommand方法)便可以实现不同的功能。

缺点:

  • 实现一个具体的命令系统,可能要创建很多的具体命令对象。

http://chatgpt.dhexx.cn/article/aavO5L7r.shtml

相关文章

命令模式中介者模式

有情怀,有干货,微信搜索【三太子敖丙】关注这个有一点点东西的程序员。 本文 GitHub https://github.com/JavaFamily 已收录,有一线大厂面试完整考点、资料以及我的系列文章。 最近在跟大家分享设计模式系列的文章有学妹问我,命令…

Linux 三种命令模式

vim :文本编辑器 vim的三种模式:命令模式、输入模式、底线命令模式 命令模式:即用户刚刚启动的Vim模式 常用命令 i 切换到输入模式,输入字符。x 删除当前光标所在出的字符。: 切换到底线命令模式,一在最底行输入命令。 输入模式:在命令模…

【源码分析设计模式 13】命令模式

一、基本介绍 1、在软件设计中,我们经常需要向某些对象发送请求,但是并不知道请求的接收者是谁,也不知道被请求的操作时哪个,我们只需在程序运行时指定具体的请求接收者即可,此时,可以使用命令模式来进行设…

C# 命令模式

一、命令模式: 将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤销的操作。 ——《设计模式》 二、模式结构: Command: 定义命令的接口&#xff…

命令模式(Command模式)详解

在软件开发系统中,常常出现“方法的请求者”与“方法的实现者”之间存在紧密的耦合关系。这不利于软件功能的扩展与维护。例如,想对行为进行“撤销、重做、记录”等处理都很不方便,因此“如何将方法的请求者与方法的实现者解耦?”…

交换机基本命令模式

交换机基本命令模式 对于思科交换机来说,主要有2种配置途径: 其一,使用交换机自带的Console线缆连接到计算机的COM口,然后利用计算机的超级终端软件直接配置,首次配置通常使用这种方式; 其二,通…

Java设计模式及应用场景之《命令模式》

文章目录 一、命令模式定义二、命令模式的结构和说明三、命令模式示例四、命令模式扩展 -- 宏命令示例五、命令模式扩展 -- 可撤销和恢复操作示例1、反操作式(补偿式)2、存储恢复式 六、命令模式扩展 -- 队列请求七、命令模式扩展 -- 日志请求八、命令模…

【每天一个java设计模式(十五)】 - 命令模式

命令模式是一种数据驱动的设计模式,它属于行为型模式。请求以命令的形式包裹在对象中,并传给调用对象。调用对象寻找可以处理该命令的合适的对象,并把该命令传给相应的对象,该对象执行命令。 命令模式也就是一个用户发送请求&…

码农小汪-设计模式之-命令模式

大话设计模式的例子讲的非常的好,理解起来也方便!有时候忘了。想到这些特殊的例子感觉就是特别爽。 烤羊肉串带来的思考! 路边摊羊肉串: 老板,我这里排的比较先啊,我最先给钱。老板这个没有熟啊。我的是…

命令模式(行为型)

一、什么是命令式 命令(Command)模式又叫作动作(Action)模式或事务(Transaction)模式,是一种对象的行为模式。将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤消的操作…

命令模式---电视机遥控器

电视机是请求的接收者,遥控器是请求的发送者,遥控器上有一些按钮,不同的按钮对应电视机的不同操作。抽象命令角色由一个命令接口来扮演,有三个具体的命令类实现了抽象命令接口,这三个具体命令类分别代表三种操作&#…

C++设计模式-命令模式

目录 基本概念 代码与实例 基本概念 命令模式(Command),将一个请求封装为对象,从而使你看用不同的请求对客户端进行参数化;对请求排队或记录请求日志,以及支持可撤销操作。 命令模式的作用: …

设计模式---命令模式

命令模式 命令模式的定义 ​ 命令模式是一个高内聚的模式,其定义为:Encapsulate a request as an object,thereby letting you parameterize clients with different requests,queue or log requests,and support undoable operations.(将一…

【设计模式】命令模式 ( 简介 | 适用场景 | 优缺点 | 代码示例 )

文章目录 一、命令模式简介二、命令模式 适用场景三、命令模式 优缺点四、命令模式 与 备忘录模式五、命令模式 代码示例1、命令接口2、发布命令类3、关闭命令类4、游戏类5、命令执行者类6、测试类 一、命令模式简介 命令模式 : 将 不同的请求 封装成 不同的请求对象 , 以便 使…

设计模式(16)命令模式

**定义:**将一个请求封装成一个对象,从而让你使用不同的请求把客户端参数化,对请求排队或者记录请求日志,可以提供命令的撤销和恢复功能。 **类型:**行为类模式 类图: 命令模式的结构 ​ 顾名思义&#…

什么是命令模式?

一、命令模式的定义 命令是对命令的封装,每一个命令都是一个操作,请求方发出请求,接收方接收请求,并执行操作。命令模式解耦了请求方和接收方,命令模式属于行为型模式 二、命令模式的uml图和通用写法 uml 通用写法 …

设计模式之命令模式详解

1 概述 日常生活中,我们出去吃饭都会遇到下面的场景。我们可以将女招待理解成一个请求的发送者,用户通过它来发送一个“点餐”请求,而厨师是“点餐”请求的最终接收者和处理者,在图中,顾客和厨师之间并不存在直接耦合…

命令模式

一、命令模式介绍 在软件设计中,我们经常需要向某些对象发送请求,但是并不知道请求的接收者是谁,也不知道被请求的操作是哪个。我们只需要在程序运行时指定具体的请求接收者即可,此时可以使用命令模式来设计。 命令模式使得请求发…

Java设计模式——命令模式

文章目录 命令模式 命令模式 命令模式很好理解,举个例子,司令员下令让士兵去干件事情,从整个事情的角度来考虑,司令员的作用是,发出口令,口令经过传递,传到了士兵耳朵里,士兵去执行…

如何设置IPv4和IPv6报文的DSCP值——网络测试仪实操

一、操作说明 在QoS测试中,经常要设置不同优先级的报文,来验证被测设备对于优先级的调度。所以,我们就要了解如何设置IPv6和IPv6报文中的DSCP(大部分使用DSCP值,也会用到TOS值) 这里我们使用测试接交换机&…