携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第N天,点击查看活动详情
1.意图:
将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤销的操作。 在面向对象编程的范畴中,命令模式(英语:Command pattern)是一种设计模式,它尝试以对象来代表实际行动。命令对象可以把行动(action) 及其参数封装起来,于是这些行动可以被:
- 重复多次
- 取消(如果该对象有实现的话)
- 取消后又再重做
2.命令(Command)模式的构成:
- 客户角色:创建一个具体命令对象,并确定其接收者
- 命令角色:声明一个给所有具体命令类的抽象接口。这是一个抽象角色,通常由一个接口或抽象类实现
- 具体命令角色:定义一个接收者和行为之间的若耦合,实现execute方法,负责调用接收者的相应操作
- 请求者角色:负责调用命令对象执行请求
- 接收者角色:负责具体实施和执行一个请求
3.命令模式UML图:
4.命令模式序列图:
5.代码示例:
客户角色:
public class Client {
public static void main(String[] args) {
Receiver receiver = new Receiver();
Command command = new ConcreteCommand(receiver);
Invoker invoker = new Invoker();
invoker.setCommand(command);
invoker.executeCommand(); // 执行相应的命令
}
}
命令角色:
public abstract class Command {
protected Receiver receiver;
public Command(Receiver receiver) {
this.receiver = receiver;
}
public abstract void execute();
}
抽象命令角色:
public class ConcreteCommand extends Command {
public ConcreteCommand(Receiver receiver) {
super(receiver);
}
@Override
public void execute() {
receiver.action();
}
}
请求者角色:
public class Invoker {
private Command command;
public void setCommand(Command command) {
this.command = command;
}
public void executeCommand() {
this.command.execute();
}
}
接受者角色:
public class Receiver {
public void action() {
System.out.println("Receiver executed");
}
}