命令模式可以将请求发送者和请求接收者完全解耦,发送者与接收者之间没有直接引用关系,发送请求的对象只需要知道如何发送请求,而不必知道如何完成请求。
命令模式的定义:将一个请求封装为一个对象,从而可用不同的请求对客户进行参数化,对请求排队或者记录请求日志,以及支持可撤销的操作。
命令模式的结构与实现:
1.Command(抽象命令类):抽象命令类一般是一个抽象类或接口,在其中声明了用于执行请求的方法,通过这些方法可以调用请求接收者的相关操作。
public abstract class Command {
public abstract void execute();
}
2.ConcreteCommand(具体命令类):具体命令类是抽象命令类的子类,实现了在抽象命令类中声明的方法,它对应具体的接收者对象,将接收者对象的动作绑定其中。
public class ConcreteCommand extends Command {
private Receiver receiver;
public ConcreteCommand() {
receiver=new Receiver();
}
@Override
public void execute() {
receiver.action();
}
}
3.Invoker(调用者):调用者即请求发送者,它通过命令对象来执行请求。一个调用者并不需要在设计时确定其接收者,因此它只与抽象命令类之间存在关联关系。
public class Invoker {
private Command command;
public Invoker(Command command) {
this.command=command;
}
public void setCommand(Command command) {
this.command = command;
}
public void request() {
//调用命令类中的方法
command.execute();
}
}
4.Receiver(接收者):接收者执行与请求相关的操作,具体实现对请求的业务处理。
public class Receiver {
public void action() {
System.out.println("接收者调用具体业务!");
}
}
5.Test:
public class Test {
public static void main(String[] args) {
ConcreteCommand command=new ConcreteCommand();
Invoker invoker=new Invoker(command);
//接收者调用具体业务!
invoker.request();
}
}