1、概述
命令模式(Command Pattern)是一种行为设计模式,它将请求封装为一个对象,从而使得不同的请求可以用参数化的形式传递和处理。通过引入命令对象,命令模式将请求的发送者和接收者解耦,实现了请求队列、日志记录、撤销操作等功能,增强了系统的灵活性和可扩展性。命令模式非常适用于需要执行操作记录、撤销、重做和支持事务管理的场景。
Command:声明执行操作的接口。
ConcreteCommand:将一个接收者对象绑定于一个动作,调用接收者相应的操作,以实现 Execute。
Client:创建一个具体命令对象并确定其接收者。
Invoker:要求该命令执行这个请求。
Receiver:知道如何实施与执行一个请求相关的操作。
2、优缺点
3、实现方式
public class Test {
public static void main(String[] args) {
// 创建接收者对象
FileSystemReceiver fs = new UnixFileSystemReceiver();
// 创建具体命令并指定接收者
OpenCommand openCommand = new OpenCommand(fs);
CloseCommand closeCommand = new CloseCommand(fs);
WriteCommand writeCommand = new WriteCommand(fs);
// 创建调用者并执行命令
FileInvoker file = new FileInvoker(openCommand);
file.execute();
file = new FileInvoker(writeCommand);
file.execute();
file = new FileInvoker(closeCommand);
file.execute();
}
}
public interface Command {
void execute();
}
// 打开命令
public class OpenCommand implements Command {
private FileSystemReceiver fileSystem;
public OpenCommand(FileSystemReceiver fs) {
this.fileSystem = fs;
}
@Override
public void execute() {
this.fileSystem.openFile();
}
}
// 关闭命令
public class CloseCommand implements Command {
private FileSystemReceiver fileSystem;
public CloseCommand(FileSystemReceiver fs) {
this.fileSystem = fs;
}
@Override
public void execute() {
this.fileSystem.closeFile();
}
}
// 写命令
public class WriteCommand implements Command {
private FileSystemReceiver fileSystem;
public WriteCommand(FileSystemReceiver fs) {
this.fileSystem = fs;
}
@Override
public void execute() {
this.fileSystem.writeFile();
}
}
public interface FileSystemReceiver {
void openFile();
void writeFile();
void closeFile();
}
public class UnixFileSystemReceiver implements FileSystemReceiver {
@Override
public void openFile() {
System.out.println("Opening file in unix OS");
}
@Override
public void writeFile() {
System.out.println("Writing file in unix OS");
}
@Override
public void closeFile() {
System.out.println("Closing file in unix OS");
}
}
public class WindowsFileSystemReceiver implements FileSystemReceiver {
@Override
public void openFile() {
System.out.println("Opening file in Windows OS");
}
@Override
public void writeFile() {
System.out.println("Writing file in Windows OS");
}
@Override
public void closeFile() {
System.out.println("Closing file in Windows OS");
}
}
public class FileInvoker {
public Command command;
public FileInvoker(Command command) {
this.command = command;
}
public void execute() {
this.command.execute();
}
}
4、应用场景
智能家居系统:可以将对不同设备(如灯、空调、电视等)的操作封装为命令对象,通过遥控器或智能控制中心来调用这些命令。
事务管理系统:在数据库操作中,可以将每个数据库操作(如插入、更新、删除)封装为命令对象,以便于事务的回滚和重做。
文本编辑器:将每个编辑操作(如输入、删除、复制、粘贴)封装为命令对象,可以实现撤销和重做功能。
任务队列系统:可以将每个任务封装为命令对象,并将这些命令对象放入队列中,以便于按顺序执行或分布式处理。