前言
在Java开发中,设计模式是常用的一种编码方式,合理使用设计模式可以帮助开发人员更快地编写出高效、可靠和可维护的代码。本期将撰写一个关于设计模式的系列文章,总共23种设计模式将以一篇一篇文章讲解,代码笔记已开源至:Gitee点击跳转。在上一篇《Java设计模式(12)责任链模式》文章中,我们介绍了责任链模式。本文是这个系列的第十三篇章,我们将讲解一下命令模式的实现方式、应用场景以及它的用途。
命令模式
命令模式是一种行为设计模式,它将请求封装为一个对象,从而使您可以用不同的请求参数化客户端、对请求排队或记录日志,以及支持可撤销的操作。通过将动作请求(命令)封装成对象,命令模式允许请求的调用者和接收者完全解耦,使得命令可以存储、传递或延迟执行。
使用场景
1. 事务脚本:在执行某项任务时需要执行一系列操作,并且可能需要撤销。
2. 日志和回滚:在系统中记录执行的命令,以便在出现问题时能够回滚。
3. 队列请求:可以将命令放入队列中,进行异步执行。
4. 宏命令:一次执行一组命令的场景(如批量处理操作)。
5. 实现 Undo/Redo:用户界面中,用户的操作可以被撤销和重做。
代码实现
这里模拟一个遥控器来简单实现一下这个命令模式,通过遥控器发送命令去控制TV,首先得有一个TV类
/**
* 电视(接收者)
* @author Jensen
* @date 2024-04-18
* */
public class Tv {
public void turnOn(){
System.out.println("电视打开了");
}
public void turnOff(){
System.out.println("电视关闭了");
}
}
然后再有一个command接口,并创建“TurnOnTvCommand”,“TurnOffTvCommand”类,里面是具体的实现
Command
/**
* 命令接口
* @author Jensen
* @date 2024-04-18
* */
public interface Command {
void execute();
}
TurnOnTvCommand
/**
* 打开电视命令
* @author Jensen
* @date 2024-04-18
* */
public class TurnOnTvCommand implements Command {
private final Tv tv;
public TurnOnTvCommand(Tv tv) {
this.tv = tv;
}
@Override
public void execute() {
tv.turnOn();
}
}
TurnOffTvCommand
/**
* 关闭电视命令
* @author Jensen
* @date 2024-04-18
* */
public class TurnOffTvCommand implements Command {
private final Tv tv;
public TurnOffTvCommand(Tv tv) {
this.tv = tv;
}
@Override
public void execute() {
tv.turnOff();
}
}
最后创建一个遥控器类:RemoteControl,此类供客户端使用
/**
* 遥控器
* @author Jensen
* @date 2024-04-18
* */
public class RemoteControl {
private Command command;
public void setCommand(Command command){
this.command = command;
}
public void pressButton(){
command.execute();
}
}
测试使用
System.out.println("------------------------------命令模式-----------------------------");
Tv tv = new Tv();
TurnOnTvCommand turnOnTvCommand = new TurnOnTvCommand(tv);
TurnOffTvCommand turnOffTvCommand = new TurnOffTvCommand(tv);
com.nn.command.RemoteControl remoteControl = new com.nn.command.RemoteControl();
//打开电视操作
remoteControl.setCommand(turnOnTvCommand);
remoteControl.pressButton();
//关闭电视操作
remoteControl.setCommand(turnOffTvCommand);
remoteControl.pressButton();
输出:
结语
使用命令模式的优点
• 解耦:将请求的发出者和执行者解耦,便于扩展和维护。
• 扩展性:可以方便地添加新的命令和撤销功能,而不影响其他代码。
• 支持日志和事务:可以记录命令,便于实现撤销、重做操作。
实际应用中的命令模式
• 事务管理:如数据库操作或文件操作中,可以使用命令模式来封装操作请求,以实现事务管理和日志记录。
• 任务调度系统:在任务调度系统中,每个任务可以看作一个命令对象,通过调度器进行异步处理。
总之,命令模式通过将请求封装为对象,使得系统可以更灵活地管理命令的执行和撤销,适合于任务操作和事务管理等场景。