命令模式
命令模式(Command Pattern)又称为行动(Action)模式或交易(Transaction)模式
将一个请求封装成一个对象,从而让你使用不同的请求把客户端参数化,对请求排队或者记录请求日志,可以提供命令的撤销和恢复功能。
四个角色
- 接收者
/**
* 接收者(Receiver)角色:该角色负责具体实施和执行一个请求
* <p>
* 顾名思义,是用来接收命令的
*
* @author Jenson
*/
public class Receiver {
/**
* 行动方法
*/
public void action() {
System.out.println("执行动作");
}
}
- 命令角色
/**
* 命令(Command)角色:该角色声明一个给所有具体命令类的抽象接口,定义需要执行的命令
*
* @author Jenson
*/
public interface Command {
/**
* 执行命令的方法
*/
public void execute();
}
- 具体命令角色
/**
* 具体命令(Concrete Command)角色:该角色定义一个接收者和行为之间的弱耦合,实现命令方法,并调用接收者的相应操作
*
* @author Jenson
*/
public class ConcreteCommand implements Command {
Receiver receiver;
public ConcreteCommand(Receiver receiver) {
this.receiver = receiver;
}
@Override
public void execute() {
receiver.action();
}
}
- 调用者
/**
* 调用者(Invoker)角色:该角色负责调用命令对象执行请求。
* <p>
* 一个调用者可能就调用多条命令了
*
* @author Jenson
*/
@Data
public class Invoker {
private Command command;
/**
* 执行命令
*/
public void action() {
command.execute();
}
}
调用
/**
* 调用
*
* @author Jenson
*/
public class CommandMain {
public static void main(String[] args) {
// 1、定义调用者,调用者对象就是用来执行命令,个人觉得调用者内部其实可以执行一些日志记录/快照之类的工作,来回溯调用过的命令
Invoker invoker = new Invoker();
// 2、定义接收者,这个接收者里面个人觉得就是一些具体的业务代码
Receiver receiver = new Receiver();
// 3、定义命名,这里命令里可能就有一些复杂的操作了,可能多个接收者组合操作我觉得都是可以的
Command command = new ConcreteCommand(receiver);
// 4、执行
invoker.setCommand(command);
invoker.action();
}
}
网友评论