一、介绍
- 命令模式:将一个请求封装为一个对象,从而使我们可用不同的请求对客户端进行参数化;对请求排队或者记录请求记录,以及支持可撤销的操作。也称之为:动作Action模式、事物Transaction模式
二、结构
-
command
抽象命令类 -
ConcreteCommand
具体命令类 -
Invoker
调用者/请求者- 请求的发送者,它通过命令对象来执行请求。一个调用者并不需要在设计时确定其接受者,因此它只与抽象命令之间存在关联。在程序运行时,将调用命令对象的
execute()
,间接调用接收者的相关操作。
- 请求的发送者,它通过命令对象来执行请求。一个调用者并不需要在设计时确定其接受者,因此它只与抽象命令之间存在关联。在程序运行时,将调用命令对象的
-
Receiver
接收者
接收者执行与请求相关的操作,具体实现对请求的业务处理。未抽象前,实际执行操作内容的对象 -
Client
客户类
在客户类中需要创建调用者对象、具体命令类对象,在创建具体命令对象时指定对应的接收者。发送者和接收者之间没有直接关系,都通过命令对象间接调用。
三、实例
Receiver,java
package cn.itcast.day246.command;
//接收者
public class Receiver {
public void action(){
System.out.println("接收者执行命令");
}
}
Command.java
package cn.itcast.day246.command;
//命令处理的中转接口
public interface Command {
public void execute();// 这里是返回一个空,但是实际开发中我们可以添加多个不同的方法
}
// 实际中转类
class ConcreteCommand implements Command {
private Receiver receiver;// 命令的真正执行者,当然这里也可以使用一个容器来保存多个命令的接收者
public ConcreteCommand(Receiver receiver) {
this.receiver = receiver;
}
@Override
public void execute() {
// 调用前的相关处理
//...
receiver.action();
// 调用前的相关处理
//...
}
}
Invoker.java
package cn.itcast.day246.command;
//命令的发起者
public class Invoker {
private Command command;// 当然这里我们也可以使用一个容器来保存多条命令
public Invoker(Command command) {
this.command = command;
}
//业务方法,用于调用命令类的方法
public void call() {
// 调用前的相关处理
// ...
command.execute();
// 调用后的相关处理
// ...
}
}
说明:从上面可以看到,实际上命令处理类实际上就相当于一个中转站,它从一个或者多个命令发出者(Invoker
)接收到一条或多条命令,然后分别发送到一个或多个接收者(Receiver
),当然在接收到命令之后可以进行相关的处理(这里可以进行批处理),然后发送给接收者进行处理。