1、命令模式定义
命令模式(Command),将一个请求封装为一个对象,请求以命令的形式包裹在对象中,传递给调用对象,调用对象寻找可以处理该命令的合适的对象,并将命令传递给相应的对象,该对象执行命令。
- 命令模式本质是
对命令进行封装,将发出命令的责任和执行命令的责任分开
- 每个命令都是一个操作,
一方发出请求要执行操作,另一方接收请求并执行操作
- 命令模式使
请求本身成为一个对象
,这个对象可以和其他对象一样被存储和作为参数传递
2、命令模式结构
Command:声明执行命令的接口
/*** 执行命令*/
public interface Command {/*** 执行命令*/void execute();}
ConcreteCommand:具体的命令,调用接收者执行对应的操作
import lombok.Data;import java.util.List;/*** 将一个接收者绑定于一个动作,调用接收者执行相应的操作*/
@Data
public class ConcreteCommand implements Command {/*** 命令接收对象*/protected List<Receiver> receiverList;@Overridepublic 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();}}
3、命令模式优点
- 命令模式可以较容易的设计一个命令队列,在需要的情况下,可以较为容易的将命令记入日志
- 允许接收请求的一方决定是否要否决请求,可以容易的实现对请求的撤销和重做,调用统一方法可以实现不同的功能
- 由于新加入的具体命令类不影响其它的类,所以增加新的具体命令较为容易
- 命令模式把请求一个操作的对象与知道怎么执行一个操作的对象分割开,降低对象之间的耦合度
4、命令模式缺点
命令模式针对每一个模式都要设计一个具体的命令类,某些系统可能需要大量的具体命令类,这将会影响命令模式的使用