前言
命令模式的讲解分为四篇:
一、命令模式扩展——队列请求
1.队列请求的工作方式
上一篇说了命令模式的扩展之宏命令,本节讲解一下命令模式的第二个扩展队列请求。因为命令可以将运算块打包(一个接收者和一组动作),然后将它传来传去,就像是一般的对象一样。现在,即使命令被创建许久之后,运算依然可以被调用。事实上,它甚至可以在不同的线程中被调用,例如工作队列,日程安排,线程池等。
想象有一个工作队列,你再某一端添加命令,然后另一端是线程。线程进行下面的动作:从队列中取出一个命令,调用它的execute()方法,等待这个调用完成,然后将此命令对象丢弃,再取出下一个命令。。。
下图即是体现:
2.代码实现
*******************CommandQueue**************************
/** * 命令队列 * @author wuqi * @Date 2019/1/30 13:26 */ public class CommandQueue { private LinkedList<Command> commands; public CommandQueue(){ commands = new LinkedList<>(); } public synchronized void addCommand(Command command){ commands.add(command); } public synchronized Command getCommand(){ if(commands.size() != 0){ return commands.removeLast(); } return null; } }
*****************RequestCommand**************************
/** * 请求命令 * @author wuqi * @Date 2019/1/30 13:33 */ public class RequestCommand implements Command { private String name; public RequestCommand(String name){ this.name = name; } @Override public void execute() { System.out.println("process request " + name); } @Override public void undo() { //请求命令没有撤销功能,这里不做任何处理 } }
*****************CommandQueueTest**************************
/** * @author wuqi * @Date 2019/1/30 13:34 */ public class CommandQueueTest { public static void main(String[] args) { //创建请求队列 CommandQueue commandQueue = new CommandQueue(); //创建请求命令 for(int i=0;i<15;i++){ RequestCommand requestCommand = new RequestCommand("request" + i); commandQueue.addCommand(requestCommand); } //多线程执行请求队列中的命令 for(int i=0;i<15;i++){ Thread thread = new Thread(new Runnable() { @Override public void run() { //从命令队列中取出命令执行 commandQueue.getCommand().execute(); } }); thread.start(); } } }
运行结果: