命令模式(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(); } }
核心理解
命令模式主要完成的事情是把命令的具体实施和命令的发出解耦。
有一个具体干活的类(命令接收者类),这个类里有所有执行具体命令的方法。
有一个抽象的命令类,这个类定义了一个执行的方法接口,然后它的子类(这些子类的个数和具体命令的个数是一致的,比如说那个具体干活的类需要做两件事,一个是打开电脑,一个是关闭电脑,那么就会有两个不同的子类来继承这个抽象的命令类!)继承这个类并重写它的执行命令的方法,这里有个点需要注意:这些子类需要关联那个命令接收者类,用那个类的方法来重写执行方法!
好看请赞,养成习惯:) 本文来自博客园,作者:靠谱杨, 转载请注明原文链接:https://www.cnblogs.com/rainbow-1/p/15626937.html
欢迎来我的51CTO博客主页踩一踩 我的51CTO博客
文章中的公众号名称可能有误,请统一搜索:靠谱杨的秘密基地
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· 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代码运行成功但是数据库数据没有更新