命令模式(Command)

定义:

将一个请求封装为一个对象,从而使我们可用不同的请求对客户进行参数化。

本质上是对命令进行封装,将发出命令的责任和执行命令的责任分隔开。

角色:

  • 接收者类:实现了具体的业务操作,拿电视机来说,这个类实现了电视机的开启和关闭的真实操作方法。
  • 抽象命令类:定义了一个执行命令的方法接口,由其子类实现。
  • 具体命令类(一个命令一个类):实现抽象命令接口,关联接收者类,调用接受者类中具体的一个命令,比如这个具体命令类是要开启电视机,那么执行命令的方法就调用接受者对象中的开启命令。
  • 调用者类:相当于遥控器,把所有可能的操作集合在一起,客户端只需要使用遥控器就可以完成所有命令的发起,构造方法(形参是是抽象命令队对象,实参是具体命令对象)完成所有具体命令对象的注入,提供执行命令的方法,用具体命令对象调用具体命令的执行方法。

关键代码:

//接收者:真正执行命令的对象
public class Light {
public void open(){
System.out.println("打开电灯!");
}
}
public interface Command {
public void execute();
}
// 这是一个命令,所以需要实现Command接口
public class LightOnCommand implements Command {
Light light;
// 构造器传入某个电灯,以便让这个命令控制,然后记录在实例变量中
public LightOnCommand(Light light) {
this.light = light;
}
// 这个execute方法调用接收对象的on方法
public void execute() {
light.on();
}
}
public class SimpleRemoteControl {
// 有一个插槽持有命令,而这个命令控制着一个装置
Command slot;
public SimpleRemoteControl() {}
// 这个方法用来设置插槽控制的命令
public void setCommand(Command command) {
slot = command;
}
// 当按下按钮时,这个方法就会被调用,使得当前命令衔接插槽,并调用它的execute方法
public void buttonWasPressed() {
slot.execute();
}
}

客户端使用

public class RemoteControlTest {
public static void main(String[] args) {
// 遥控器就是调用者,会传入一个命令对象,可以用来发出请求
SimpleRemoteControl remote = new SimpleRemoteControl();
// 现在创建一个电灯对象,此对象也就是请求的接收者
Light light = new Light();
// 这里创建一个命令,然后将接收者传给它
LightOnCommand lightOn = new LightOnCommand(light);
// 把命令传给调用者
remote.setCommand(lightOn);
// 模拟按下按钮
remote.buttonWasPressed();
}
}

核心理解

命令模式主要完成的事情是把命令的具体实施和命令的发出解耦

有一个具体干活的类(命令接收者类),这个类里有所有执行具体命令的方法

有一个抽象的命令类,这个类定义了一个执行的方法接口,然后它的子类(这些子类的个数和具体命令的个数是一致的,比如说那个具体干活的类需要做两件事,一个是打开电脑,一个是关闭电脑,那么就会有两个不同的子类来继承这个抽象的命令类!)继承这个类并重写它的执行命令的方法,这里有个点需要注意:这些子类需要关联那个命令接收者类,用那个类的方法来重写执行方法!

posted @   靠谱杨  阅读(774)  评论(0编辑  收藏  举报
编辑推荐:
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
历史上的今天:
2020-11-30 【已解决】JDBC --- update代码运行成功但是数据库数据没有更新

喜欢请打赏

扫描二维码打赏

了解更多

点击右上角即可分享
微信分享提示