设计模式 -- 命令模式
设计模式 —— 命令模式
目录
概述
UML
实现
优缺点
使用场景
概述
命令模式是一种行为类设计模式,核心是将每种请求或操作封装为一个独立的对象,从而可以集中管理这些请求或操作,比如将请求队列化依次执行,或者对操作进行记录和撤销。
UML
实现
// 设备类
public class Device {
private String name;
public Device(String name) {
this.name = name;
}
public void turnOn() {
System.out.println(name + ":设备打开");
}
public void turnOff() {
System.out.println(name + ":设备关闭");
}
}
// 通用命令接口,确保每个接口都有特定方法
public interface Command {
void execute();
}
/**
* 关闭 按钮
*/
public class TurnOffCommand implements Command{
private Device device;
public TurnOffCommand(Device device) {
this.device = device;
}
public void execute() {
device.turnOff();
}
}
/**
* 开启按钮
*/
public class TurnOnCommand implements Command{
private Device device;
public TurnOnCommand(Device device) {
this.device = device;
}
public void execute() {
device.turnOn();
}
}
/**
* 调用者
*/
public class RemoteControl {
private Command command;
public void setCommand(Command command) {
this.command = command;
}
public void pressButton() {
command.execute();
}
}
/**
* 客户端
*/
public class Client {
public static void main(String[] args) {
// 创建接收者对象
Device tv = new Device("TV");
Device stereo = new Device("Stereo");
// 创建具体的执行命令,可以绑定不同设备
TurnOnCommand turnOn = new TurnOnCommand(tv);
TurnOffCommand turnOff = new TurnOffCommand(stereo);
// 创建调用者
RemoteControl remote = new RemoteControl();
// 执行命令
remote.setCommand(turnOn);
remote.pressButton();
remote.setCommand(turnOff);
remote.pressButton();
}
}
/**
* 输出:
* TV:设备打开
* Stereo:设备关闭
*/
优点:
- 解耦请求发送者和接收者: 命令模式将请求封装成对象,使得请求发送者和请求接收者之间解耦,可以灵活地组合命令对象和请求接收者,降低系统的耦合度。
- 容易扩展新命令: 可以通过创建新的命令类来轻松扩展系统的功能,无需修改现有代码,符合开闭原则。
- 支持撤销和重做: 命令模式可以很容易地支持撤销和重做操作,通过保存历史命令或者记录执行前的状态数据,实现系统的撤销功能。
- 支持命令队列和日志: 可以将命令对象存储在队列中,实现命令的排队和日志记录,从而支持命令的延迟执行、撤销和重做操作。
- 适用于线程安全性要求高的场景: 在多线程环境下,命令模式可以有效地控制命令的执行顺序和并发访问,保证系统的安全性。
缺点:
- 类膨胀: 可能会导致系统中命令类的数量急剧增加,特别是系统中包含大量具体命令时,可能会导致类膨胀问题。
- 实现复杂度: 实现命令模式需要创建多个类和对象,可能会增加系统的复杂度,特别是对于简单的命令场景可能显得繁琐。
- 命令的执行效率: 在某些情况下,使用命令模式可能会影响系统的性能,因为每个命令都需要封装成对象,可能会增加额外的开销。
使用场景
- 系统需要统一处理多种复杂的操作,比如操作排队,记录操作历史,撤销重做等
- 系统需要持续新增新的命令,或者要处理复杂的组合命令(子命令),可以使用命令模式实现解耦
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 IT蛋的个人博客!