命令模式简介
定义
将一个请求封装成一个对象,从而让用户使用不同的请求把客户端参数化,对请求排队或记录请求日志,以及支持可撤销的操作
优点(摘自大话设计模式)
(1)比较容易地设计一个命令队列
(2)在需要的情况下,可以比较容易地将命令记入日志
(3)允许接受请求的以放决定是否要否决请求
(4)可以容易地实现对请求的撤销和重做,新增加的具体命令类不影响其他类
使用场景
需要抽象出待执行的操作,然后以参数的形式提供出来,类似于过程设计中的回调机制,而命令模式正式回调机制的一个面向对象的替代品
需要支持事务操作
实例
根据上面的介绍,命令模式需要一个命令的接口类+具体的命令类+命令的管理或调度类+执行者
public interface Command {
void execute();
}
具体命令
public class ConcreteCommand implements Command{
Receiver receiver;
public ConcreteCommand(Receiver receiver) {
this.receiver = receiver;
}
@Override
public void execute() {
receiver.action();
System.out.println("执行了具体命令");
}
}
命令接收者
public class Receiver {
String name;
public Receiver(String name) {
this.name = name;
}
public void action() {
System.out.print(name);
}
}
public class Invoker {
List<Command> commands;
public void addCommands(Command command) {
if (commands == null)
commands = new ArrayList<>();
commands.add(command);
}
public void cancelCommand(Command command) {
if (commands == null || commands.isEmpty()) return;
commands.remove(command);
}
public void execute() {
if (commands == null || commands.isEmpty()) return;
for (Command command : commands) {
command.execute();
}
}
}
测试调用类
public class Test {
public static void main(String[] args) {
Receiver receiver=new Receiver("小明");
ConcreteCommand concreteCommand=new ConcreteCommand(receiver);
Invoker invoker=new Invoker();
invoker.addCommands(concreteCommand);
invoker.execute();
}
}
本站文章版权归原作者及原出处所有 。内容为作者个人观点, 并不代表本站赞同其观点和对其真实性负责,本站只提供参考并不构成任何投资及应用建议。本站是一个个人学习交流的平台,网站上部分文章为转载,并不用于任何商业目的,我们已经尽可能的对作者和来源进行了通告,但是能力有限或疏忽,造成漏登,请及时联系我们,我们将根据著作权人的要求,立即更正或者删除有关内容。本站拥有对此声明的最终解释权。