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