コマンドモードコマンド:要求をオブジェクトとしてカプセル化して、さまざまな要求でクライアントをパラメーター化し、要求キューをパラメーター化したり、要求ログを記録したり、テスト容易性操作をサポートしたりできるようにします。
コマンドモード
第1に、コマンドキューの設計が簡単です。
第2に、必要に応じてコマンドをログに統合するのが簡単です。
第3に、要求を受け入れる側が要求を拒否するかどうかを決定できます。
第4に、簡単に実現できます。リクエストのキャンセルとやり直し。
第5に、新しく追加された特定のコマンドクラスは他のクラスに影響を与えないため、新しい特定のコマンドクラスを簡単に追加できます。
コマンドパターンは、操作を要求するオブジェクトを、操作の実行方法を知っているオブジェクトから分離します。
//命令类,用来声明执行操作的接口
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命令