JAVA 设计模式 命令模式
用途
命令模式是一种行为型模式。
结构
图-命令模式结构图
Command : 用来声明执行操作的接口。
abstract class Command {
protected Receiver receiver;
public Command(Receiver receiver) {
this.receiver = receiver;
}
public abstract void Execute();
}
protected Receiver receiver;
public Command(Receiver receiver) {
this.receiver = receiver;
}
public abstract void Execute();
}
ConcreteCommand : 将一个接收者对象绑定一个动作,调用接收者相应的操作,以实现Execute。
class ConcreteCommand extends Command {
public ConcreteCommand(Receiver receiver) {
super(receiver);
}
@Override
public void Execute() {
receiver.Action();
}
}
public ConcreteCommand(Receiver receiver) {
super(receiver);
}
@Override
public void Execute() {
receiver.Action();
}
}
Invoker : 要求该命令执行这个请求。
class Invoker {
private Command command;
public Invoker(Command command) {
this.command = command;
}
public void ExecuteCommand() {
command.Execute();
}
}
private Command command;
public Invoker(Command command) {
this.command = command;
}
public void ExecuteCommand() {
command.Execute();
}
}
Receiver : 知道如何实施与执行一个与请求相关的操作,任何类都可能作为一个接收者。
class Receiver {
public void Action() {
System.out.println("执行请求");
}
}
public void Action() {
System.out.println("执行请求");
}
}
Client : 创建一个具体命令对象并设定它的接受者。
public class CommandPattern {
public static void main(String[] args) {
Receiver receiver = new Receiver();
Command cmd = new ConcreteCommand(receiver);
Invoker invoker = new Invoker(cmd);
invoker.ExecuteCommand();
}
}
public static void main(String[] args) {
Receiver receiver = new Receiver();
Command cmd = new ConcreteCommand(receiver);
Invoker invoker = new Invoker(cmd);
invoker.ExecuteCommand();
}
}
交互
图-命令模式交互图
1、Client 创建一个 ConcreteCommand 对象并指定他的 Receiver 对象。
2、某个 Invoker 对象存储该 ConcreteCommand 对象。
3、该 Invoker 通过调用 Command 对象的 Execute 操作来提交一个请求。若该命令是可撤销的,ConcreteCommand 就在执行 Execute 操作之前存储当前状态以用于取消该命令。
4、ConcreteCommand 对象对调用它的 Receiver 的一些操作以执行该请求。
2、某个 Invoker 对象存储该 ConcreteCommand 对象。
3、该 Invoker 通过调用 Command 对象的 Execute 操作来提交一个请求。若该命令是可撤销的,ConcreteCommand 就在执行 Execute 操作之前存储当前状态以用于取消该命令。
4、ConcreteCommand 对象对调用它的 Receiver 的一些操作以执行该请求。
要点
1、命令模式的本质是对命令进行封装,将发出命令的责任和执行命令的责任分割开。
2、每一个命令都是一个操作:请求的一方发出请求,要求执行一个操作;接收的一方收到请求,并执行操作。
3、命令模式允许请求的一方和接收的一方独立开来,使得请求的一方不必知道接收请求的一方的接口,更不必知道请求是怎么被接收,以及操作是否被执行、何时被执行,以及是怎么被执行的。
4、命令模式使请求本身成为一个对象,这个对象和其他对象一样可以被存储和传递。
5、命令模式的关键在于引入了抽象命令接口,且发送者针对抽象命令接口编程,只有实现了抽象命令接口的具体命令才能与接收者相关联。
2、每一个命令都是一个操作:请求的一方发出请求,要求执行一个操作;接收的一方收到请求,并执行操作。
3、命令模式允许请求的一方和接收的一方独立开来,使得请求的一方不必知道接收请求的一方的接口,更不必知道请求是怎么被接收,以及操作是否被执行、何时被执行,以及是怎么被执行的。
4、命令模式使请求本身成为一个对象,这个对象和其他对象一样可以被存储和传递。
5、命令模式的关键在于引入了抽象命令接口,且发送者针对抽象命令接口编程,只有实现了抽象命令接口的具体命令才能与接收者相关联。
作者:静默虚空
欢迎任何形式的转载,但请务必注明出处。
限于本人水平,如果文章和代码有表述不当之处,还请不吝赐教。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~