命令模式 Command:将一个请求封装为一个对象,从而使你可用不同的请求对客户端进行参数化,对请求队列或记录请求日志,以及支持可测性的操作。
命令模式
第一、能够容易设计一个命令队列;
第二、在需要的情况下,可以较容易地将命令融入日志;
第三、允许接受请求的一方决定是否要否决请求;
第四、可以容易地实现对请求的撤销和重做;
第五、由于新加进来的具体命令类不影响其他的类,因此增加新的具体命令类很容易
命令模式把请求一个操作的对象与知道怎样执行一个操作的对象分隔开。
//命令类,用来声明执行操作的接口
abstract public class Command {
protected Receiver receiver;
protected String string;
public Command(Receiver receiver,String string) {
this.receiver = receiver;
this.string = string;
}
abstract public void Execute(String string);
}
//任何类都可以作为一个接收者,知道如何实施与执行一个与请求相关的操作
public class Receiver {
public void Action(String string) {
System.out.println("执行请求" + string);
}
}
//具体命令类,将一个接收者对象绑定于一个动作,调用接收者相应的操作,以实现Execute
public class ConcreteCommand extends Command {
public ConcreteCommand(Receiver receiver, String string) {
super(receiver, string);
}
@Override
public void Execute(String string) {
receiver.Action(string);
}
}
//请求者类,要求该命令执行请求
public class Invoker {
private ArrayList<Command> list = new ArrayList<>();
public void SetCommand(Command command) {
list.add(command);
}
public void CancelCommand(Command command) {
list.remove(command);
}
public void ExecuteCommand() {
for (Command command : list) {
command.Execute(command.string);
}
}
public static void main(String[] args) {
Receiver receiver = new Receiver();
Command commandA = new ConcreteCommand(receiver, "A命令");
Command commandB = new ConcreteCommand(receiver, "B命令");
Invoker invoker = new Invoker();
invoker.SetCommand(commandA);
invoker.SetCommand(commandB);
invoker.ExecuteCommand();
invoker.CancelCommand(commandB);
invoker.ExecuteCommand();
}
}
输出:
执行请求A命令
执行请求B命令
执行请求A命令