【玩转23种Java设计模式】行为型模式篇:命令模式
软件设计模式(Design pattern),又称设计模式,是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性、程序的重用性。
汇总目录链接:【玩转23种Java设计模式】学习目录汇总整理
文章目录
- 一、简介
- 二、实例
- 1、命令接口(Command)
- 2、灯(Light)
- 3、打开灯的命令(LightOnCommand)
- 4、关闭灯的命令(LightOffCommand)
- 5、遥控器(RemoteControl)
- 6、客户端(CommandPatternExample)
- 三、总结
- 1、优点
- 2、缺点
- 3、应用场景
一、简介
命令模式(Command Pattern)是一种行为型设计模式,它将请求封装成对象,从而使得可以使用不同的请求、队列或日志来参数化其他对象,同时支持可撤销的操作。该模式的核心是将“请求”抽象为独立的对象,这样可以更灵活地设计系统的各个模块。
主要角色:
- Command(命令接口):定义命令执行的接口。
- ConcreteCommand(具体命令类):实现命令接口,绑定一个接收者并实现具体的动作。
- Invoker(调用者):持有命令对象并触发执行。
- Client(客户端):创建命令对象并设置其接收者和调用者。
二、实例
例如:模拟智能家居中的灯光控制场景。
1、命令接口(Command)
interface Command {
void execute();
void undo();
}
2、灯(Light)
class Light {
public void on() {
System.out.println("The light is ON.");
}
public void off() {
System.out.println("The light is OFF.");
}
}
3、打开灯的命令(LightOnCommand)
class LightOnCommand implements Command {
private Light light;
public LightOnCommand(Light light) {
this.light = light;
}
@Override
public void execute() {
light.on();
}
@Override
public void undo() {
light.off();
}
}
4、关闭灯的命令(LightOffCommand)
class LightOffCommand implements Command {
private Light light;
public LightOffCommand(Light light) {
this.light = light;
}
@Override
public void execute() {
light.off();
}
@Override
public void undo() {
light.on();
}
}
5、遥控器(RemoteControl)
class RemoteControl {
private Command command;
public void setCommand(Command command) {
this.command = command;
}
public void pressButton() {
command.execute();
}
public void pressUndo() {
command.undo();
}
}
6、客户端(CommandPatternExample)
public class CommandPatternExample {
public static void main(String[] args) {
Light livingRoomLight = new Light();
Command lightOn = new LightOnCommand(livingRoomLight);
Command lightOff = new LightOffCommand(livingRoomLight);
RemoteControl remote = new RemoteControl();
// 打开灯
remote.setCommand(lightOn);
remote.pressButton();
// 撤销操作
remote.pressUndo();
// 关闭灯
remote.setCommand(lightOff);
remote.pressButton();
// 撤销操作
remote.pressUndo();
}
}
三、总结
1、优点
- 解耦请求与实现:命令模式将请求的发送者和接收者解耦,使得发送者无需知道接收者的具体实现。
- 支持撤销与重做:通过在命令类中添加撤销逻辑,可以轻松实现撤销和重做功能。
- 灵活扩展:可以很方便地新增命令,而不需要修改现有代码。
2、缺点
- 命令类较多:对于每一个具体操作都需要一个命令类,增加了类的数量和系统复杂性。
- 请求链复杂:如果命令链较长,可能会导致请求的跟踪和管理变得困难。
3、应用场景
- 事务性操作:例如数据库操作的撤销和重做。
- 任务队列系统:将操作排队执行,例如打印队列、任务调度。
- GUI开发:按钮的点击事件可以通过命令模式封装。
- 日志记录:记录每个命令的执行,便于系统回滚或重做操作。