( 二十 )、设计模式 之 命令模式(Command)
( 二十 )、设计模式 之 命令模式(Command)
1、简介
定义: 命令模式(Command Pattern)是一种行为型设计模式。在命令模式中,请求被封装为一个独立的对象,并且将其参数化,以便在不同的请求中传递不同的参数。它将请求和处理分开,使得请求发送者和接收者解耦,这样可以使得两者之间通过命令对象进行沟通,从而方便将命令对象进行储存、传递、调用、增加与管理。”请求发起者”和“请求执行者”之间的解耦是通过命令对象实现的,命令对象起到了纽带桥梁的作用。
2、命令模式的结构说明
- 抽象命令(Command): 类中对需要执行的命令进行声明,一般来说要对外公布一个execute方法用来执行命令。
- 具体命令(Concrete Command): 持有具体命令的执行者(Receiver),对抽象类中声明的方法进行实现,并转调具体的执行者(Receiver)。
- 命令接收者(Receiver): 请求执行者,具体命令对象业务的真正处理者。
- 调用者(Invoker): 请求发起者,负责接收命令并且执行命令,是请求的发送者,它通常拥有很多的命令(Command)对象,并通过访问命令对象来执行相关请求,它不直接访问接收者。
3、命令模式的代码实现
/**
* @Author dw
* @ClassName Command
* @Description 抽象命令类
* @Date 2023/12/19 14:02
* @Version 1.0
*/
public abstract class Command {
/**
* 对外提供一个执行操作
*/
public abstract void execute();
/**
* 撤销动作(操作)
*/
public abstract void undo();
}
/**
* @Author dw
* @ClassName ConcreteCommand
* @Description 具体命令类
* @Date 2023/12/19 14:03
* @Version 1.0
*/
public class ConcreteCommand extends Command {
/**
* 持有一个具体的命令执行者
*/
private Receiver receiver;
public ConcreteCommand(Receiver receiver){
this.receiver = receiver;
}
@Override
public void execute() {
// 转调具体的命令执行者,执行命令
receiver.on();
}
/**
* 撤销动作(操作)
*/
@Override
public void undo() {
receiver.off();
}
}
/**
* @Author dw
* @ClassName Receiver
* @Description 接受类-命令的执行者
* @Date 2023/12/19 14:04
* @Version 1.0
*/
public class Receiver {
public void on(){
System.out.println("电灯打开了.. ");
}
public void off(){
System.out.println("电灯关闭了.. ");
}
}
/**
* @Author dw
* @ClassName Invoker
* @Description
* @Date 2023/12/19 14:06
* @Version 1.0
*/
public class Invoker {
private Command command;
public Invoker(Command command) {
this.command = command;
}
public void doSomething() {
System.out.println("这里是调用者,执行命令");
command.execute();
}
}
/**
* @Author dw
* @ClassName ClientTest
* @Description 客户端测试
* @Date 2023/12/19 14:14
* @Version 1.0
*/
public class ClientTest {
public static void main(String[] args) {
Receiver receiver = new Receiver();
Command command = new ConcreteCommand(receiver);
// 客户端通过调用者来执行命令
Invoker invoker = new Invoker(command);
System.out.println("客户端请求调用者");
invoker.doSomething();
}
}
4、命令模式的优缺点
优点: 命令模式将命令的调用者和执行者分开,使得双方不必知道对方是如何操作的,降低了耦合度;
缺点: 使用命令模式,不用管命令多简单,都需要写一个命令类来封装,会有大量具体的命令类。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 清华大学推出第四讲使用 DeepSeek + DeepResearch 让科研像聊天一样简单!
· 推荐几款开源且免费的 .NET MAUI 组件库
· 实操Deepseek接入个人知识库
· 易语言 —— 开山篇
· 【全网最全教程】使用最强DeepSeekR1+联网的火山引擎,没有生成长度限制,DeepSeek本体