命令模式的概念
命令模式(Command Pattern)是一种行为设计模式,它将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤销的操作。命令模式允许系统使用不同的请求把客户端参数化,对请求排队或者记录请求日志,可以提供命令的撤销和恢复功能。
命令模式的优缺点
优点:
- 降低系统耦合度:命令模式使得请求发送者与请求接收者之间解耦,发送者与接收者之间没有直接引用关系,发送请求的对象只需要知道如何发送请求,而不必知道如何完成请求。
- 新的命令可以很容易地添加到系统中:只需实现一个新的命令类,并将其设置到接收者对象中即可。
- 可以方便地实现请求的撤销和重做:只需在命令类中增加撤销和重做的方法,然后在客户端调用这些方法即可。
- 支持事务处理:命令模式中的命令对象可以被存储到日志中,从而支持事务处理。
缺点:
- 系统有过多的具体命令类:在有些系统中,可能需要创建大量的具体命令类,这会使系统变得复杂。
- 命令模式可能会导致某些系统有过多的具体命令类:因为针对每一个对请求接收者的调用操作都需要设计一个具体命令类,因此在某些系统中可能需要提供大量的具体命令类。
命令模式的应用场景
- 需要实现请求的发送者和接收者之间的解耦时:命令模式允许请求发送者通过命令对象间接地调用请求接收者的方法。
- 需要支持命令的撤销和重做时:命令对象可以存储到历史记录中,从而支持撤销和重做操作。
- 需要支持事务处理时:命令对象可以被存储到日志中,从而支持事务处理。
- 需要支持命令的排队和日志记录时:命令对象可以被放入队列中,从而支持命令的排队和异步处理。
命令模式的代码实现
以下是一个简单的命令模式的代码实现:
// 抽象命令接口 |
|
public interface Command { |
|
void execute(); |
|
void undo(); |
|
} |
|
// 具体命令类 |
|
public class ConcreteCommand implements Command { |
|
private Receiver receiver; |
|
public ConcreteCommand(Receiver receiver) { |
|
this.receiver = receiver; |
|
} |
|
@Override |
|
public void execute() { |
|
receiver.action(); |
|
} |
|
@Override |
|
public void undo() { |
|
receiver.undoAction(); |
|
} |
|
} |
|
// 请求接收者 |
|
public class Receiver { |
|
public void action() { |
|
System.out.println("执行操作"); |
|
} |
|
public void undoAction() { |
|
System.out.println("撤销操作"); |
|
} |
|
} |
|
// 调用者(Invoker) |
|
public class Invoker { |
|
private Command command; |
|
public Invoker(Command command) { |
|
this.command = command; |
|
} |
|
public void call() { |
|
command.execute(); |
|
} |
|
public void undo() { |
|
command.undo(); |
|
} |
|
} |
|
// 客户端代码 |
|
public class Client { |
|
public static void main(String[] args) { |
|
Receiver receiver = new Receiver(); |
|
Command command = new ConcreteCommand(receiver); |
|
Invoker invoker = new Invoker(command); |
|
// 执行命令 |
|
invoker.call(); |
|
// 撤销命令 |
|
invoker.undo(); |
|
} |
|
} |