命令模式(Command),将一个请求封装为一个对象,请求以命令的形式包裹在对象中,传递给调用对象,调用对象寻找可以处理该命令的合适的对象,并将命令传递给相应的对象,该对象执行命令。
对命令进行封装,将发出命令的责任和执行命令的责任分开一方发出请求要执行操作,另一方接收请求并执行操作请求本身成为一个对象,这个对象可以和其他对象一样被存储和作为参数传递
Command:声明执行命令的接口
/**
* 执行命令
*/
public interface Command {
/**
* 执行命令
*/
void execute();
}
ConcreteCommand:具体的命令,调用接收者执行对应的操作
import lombok.Data;
import java.util.List;
/**
* 将一个接收者绑定于一个动作,调用接收者执行相应的操作
*/
@Data
public class ConcreteCommand implements Command {
/**
* 命令接收对象
*/
protected List<Receiver> receiverList;
@Override
public void execute() {
receiverList.forEach(Receiver::action);
}
}
Invoker:要求该命令执行这个请求
import lombok.Data;
/**
* 要求该命令执行这个请求
*/
@Data
public class Invoker {
/**
* 要执行的命令
*/
private Command command;
/**
* 执行当前命令
*/
public void executeCommand() {
command.execute();
}
}
Receiver:命令接收者,知道如何实施与执行一个与请求相关的操作
import lombok.Data;
/**
* 接收者,执行一个与请求相关的操作,任何类都可以作为一个接收者
*/
@Data
public class Receiver {
private String name;
public void action() {
System.out.println(name + " 执行了请求~");
}
}
调用方代码
import java.util.ArrayList;
import java.util.List;
public class CommandClient {
public static void main(String[] args) {
// 命令的接收者
List<Receiver> receiverList = new ArrayList<>();
Receiver receiver = new Receiver();
receiver.setName("张三");
Receiver receiver2 = new Receiver();
receiver2.setName("李四");
receiverList.add(receiver);
receiverList.add(receiver2);
// 具体命令
ConcreteCommand concreteCommand = new ConcreteCommand();
concreteCommand.setReceiverList(receiverList);
// 要执行的命令
Invoker invoker = new Invoker();
invoker.setCommand(concreteCommand);
//执行具体命令
invoker.executeCommand();
}
}
命令模式针对每一个模式都要设计一个具体的命令类,某些系统可能需要大量的具体命令类,这将会影响命令模式的使用