命令设计模式

news/2024/11/29 22:39:59/

命令模式

  • 命令模式定义:
    • 使用场景
      • 1、遥控器:遥控器是一种典型的命令模式应用,遥控器中的每一个按钮都对应着一个命令对象,当用户按下按钮时,遥控器会发送相应的命令对象给电器,电器会根据命令对象来执行相应的操作。
      • 2、厨师和服务员:在餐厅中,厨师和服务员之间的关系可以看作是一种命令模式。服务员负责接收顾客的点餐请求,将请求封装成一个命令对象,并将命令对象发送给厨师。厨师会根据命令对象来烹饪相应的菜品,完成后将菜品交给服务员。
      • 3、智能家居:智能家居系统中,用户可以通过手机或者语音控制设备的开关、调节亮度等操作。这些操作都可以看作是命令对象,当用户发送一个命令对象时,智能家居系统会根据命令对象来控制相应的设备。
      • 4、播放器:在音乐或者影视播放器中,用户可以通过命令对象来控制音乐或者影片的播放、暂停、快进等操作。播放器会根据命令对象来执行相应的操作。
    • 角色定义
      • Receive 接收者角色
      • Command 命令角色
      • lnvoker 调用者角色
    • 需求背景
      • 1、定义接收者角色 Receiver,包含电视机的操作方法,如开关、音量和频道控制等。
      • 2、定义命令接口 Command,包含执行命令的方法 execute()。
      • 3、定义具体命令类 ConcreteCommand,实现 Command 接口,包含一个接收者对象和一个执行命令的方法 execute(),在执行命令时调用接收者对象的相应方法。
      • 4、定义调用者角色 Invoker,包含一个命令对象和一个执行命令的方法 executeCommand(),在执行命令时调用命令对象的 execute() 方法。
      • 5、编写测试案例,创建一个遥控器对象和一个电视机对象,分别创建开机、关机、调节频道和音量的命令对象,并将命令对象设置到遥控器对象中,最后执行遥控器对象的执行命令方法。
      • 6、输出结果
      • 7、总结

命令模式定义:

将一个请求封装成一个对象,从而让你使用不同的请求把客户端参数化

使用场景

1、遥控器:遥控器是一种典型的命令模式应用,遥控器中的每一个按钮都对应着一个命令对象,当用户按下按钮时,遥控器会发送相应的命令对象给电器,电器会根据命令对象来执行相应的操作。

2、厨师和服务员:在餐厅中,厨师和服务员之间的关系可以看作是一种命令模式。服务员负责接收顾客的点餐请求,将请求封装成一个命令对象,并将命令对象发送给厨师。厨师会根据命令对象来烹饪相应的菜品,完成后将菜品交给服务员。

3、智能家居:智能家居系统中,用户可以通过手机或者语音控制设备的开关、调节亮度等操作。这些操作都可以看作是命令对象,当用户发送一个命令对象时,智能家居系统会根据命令对象来控制相应的设备。

4、播放器:在音乐或者影视播放器中,用户可以通过命令对象来控制音乐或者影片的播放、暂停、快进等操作。播放器会根据命令对象来执行相应的操作。

角色定义

Receive 接收者角色

该角色就是干活的角色,命令传递到这里是应该被执行的。

Command 命令角色

需要执行的所有命令都在这里声明.

lnvoker 调用者角色

接收到命令,并执行命令。

需求背景

设计一个遥控器,用户可以通过遥控器控制电视机的开关、音量和频道。

1、定义接收者角色 Receiver,包含电视机的操作方法,如开关、音量和频道控制等。

public class TV {public void turnOn() {System.out.println("TV is on");}public void turnOff() {System.out.println("TV is off");}public void changeChannel(int channel) {System.out.println("TV channel is changed to " + channel);}public void adjustVolume(int volume) {System.out.println("TV volume is adjusted to " + volume);}
}

2、定义命令接口 Command,包含执行命令的方法 execute()。

public interface Command {void execute();
}

3、定义具体命令类 ConcreteCommand,实现 Command 接口,包含一个接收者对象和一个执行命令的方法 execute(),在执行命令时调用接收者对象的相应方法。

public class TurnOnCommand implements Command {private TV tv;public TurnOnCommand(TV tv) {this.tv = tv;}@Overridepublic void execute() {tv.turnOn();}
}public class TurnOffCommand implements Command {private TV tv;public TurnOffCommand(TV tv) {this.tv = tv;}@Overridepublic void execute() {tv.turnOff();}
}public class ChangeChannelCommand implements Command {private TV tv;private int channel;public ChangeChannelCommand(TV tv, int channel) {this.tv = tv;this.channel = channel;}@Overridepublic void execute() {tv.changeChannel(channel);}
}public class AdjustVolumeCommand implements Command {private TV tv;private int volume;public AdjustVolumeCommand(TV tv, int volume) {this.tv = tv;this.volume = volume;}@Overridepublic void execute() {tv.adjustVolume(volume);}
}

4、定义调用者角色 Invoker,包含一个命令对象和一个执行命令的方法 executeCommand(),在执行命令时调用命令对象的 execute() 方法。

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

5、编写测试案例,创建一个遥控器对象和一个电视机对象,分别创建开机、关机、调节频道和音量的命令对象,并将命令对象设置到遥控器对象中,最后执行遥控器对象的执行命令方法。

public class Test {public static void main(String[] args) {TV tv = new TV();RemoteControl remoteControl = new RemoteControl();Command turnOnCommand = new TurnOnCommand(tv);Command turnOffCommand = new TurnOffCommand(tv);Command changeChannelCommand = new ChangeChannelCommand(tv, 3);Command adjustVolumeCommand = new AdjustVolumeCommand(tv, 50);remoteControl.setCommand(turnOnCommand);remoteControl.executeCommand();remoteControl.setCommand(changeChannelCommand);remoteControl.executeCommand();remoteControl.setCommand(adjustVolumeCommand);remoteControl.executeCommand();remoteControl.setCommand(turnOffCommand);remoteControl.executeCommand();}
}

6、输出结果

TV is on
TV channel is changed to 3
TV volume is adjusted to 50
TV is off

7、总结

命令模式可以将请求和处理请求的对象解耦,使得请求者和接收者之间没有直接关系,从而提高系统的灵活性和可扩展性。在本案例中,遥控器充当了调用者角色,电视机充当了接收者角色,四个具体命令类充当了命令角色,将请求和处理请求的对象解耦,使得用户可以通过遥控器来控制电视机的开关、音量和频道。


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

相关文章

【代码随想录】刷题Day15

1.层序遍历 102. 二叉树的层序遍历 1.首先层序遍历是通过队列结构实现的 2.其实就是循环将每一层节点入队列,随后出队列将数据存储起来。通过出队列的节点,将其左右节点,也就是再把下一层的节点入队列。那么我们就能得到层序遍历的结果了 3.…

【移动端网页布局】流式布局案例 ⑦ ( 水平排列的图片链接 2 | 浮动设置 | 盒子模型类型设置 | 结构伪类选择器 )

文章目录 一、水平排列的图片链接样式及核心要点1、实现效果2、HTML 结构3、CSS 样式 二、完整代码示例1、HTML 标签结构2、CSS 样式3、展示效果 一、水平排列的图片链接样式及核心要点 1、实现效果 实现如下样式 , 水平排列的图片链接 , 第一个图片占宽度的 50% , 第二第三个 …

从PDF文档中提取文字的方法及实例

如果你想在PDF文档中查找特定的文本,可以使用编辑器或搜索工具来帮助你实现这个目标。然而,如果你需要确定PDF文档中所有文字的字体和大小,那么可以使用一些不同的方法。 以下是几种方法,可以帮助你确定PDF文档中文字的字体和大小…

利用 Delte-Sigma ADC简化电路设计

很多时候在电路中选择合适的 ADC可以很大程度上简化前端的电路。这里我们一起来看一个电阻电桥的例子: 这里用到了一只仪表放大器和一只运算放大器,他们实际上主要完成了三个功能: 1. 抑制了 2.5V的共模信号; 2. 将-1…

idea2021.3.x激活教程

第一步: 下载最新的 IDEA 2021.3.3 版本安装包 先从 IDEA 官网下载 IDEA 2021.3.3 版本的安装包,下载链接可以自行百度IDEA官网。 点击下载,耐心等待下载完成。 第二步: 开始安装(已安装可跳过此步骤) 指定安装目录。 勾选创建桌面快捷方式&#xff0…

关注度拉满,RSAC 2023 热门安全工具速览

RSAConference2023于当地时间4月24日在旧金山正式拉开帷幕。自上届RSAC以来,网络安全行业发生了巨大的变化,尤其是以OpenAI聊天机器人为代表的内容生成型AI的兴起,对网络防御和攻击的影响比以往任何时候都更加明显。 今年,与RSAC相…

七彩虹DDR5主板四根开启XMP教程

七彩虹的D5主板,通常在安装8G2、16G2的情况下是可以正常开启XMP的, 但在16G4、32G2的情况下机会出现XMP超频失败或蓝屏问题 这是由于BIOS优化不足造成的 第一步还是开启XMP,也可以在选择XMP后,切换到用户自定义模式&#xff0c…

Rust - 可变引用和悬垂引用

可变引用 在上一篇文章中,我们提到了借用的概念,将获取引用作为函数参数称为 借用(borrowing),通常情况下,我们无法修改借来的变量,但是可以通过可变引用实现修改借来的变量。代码示例如下&…