有時(shí)候我們需要將多個(gè)請(qǐng)求排隊(duì),當(dāng)一個(gè)請(qǐng)求發(fā)送者發(fā)送一個(gè)請(qǐng)求時(shí),將不止一個(gè)請(qǐng)求接收者產(chǎn)生響應(yīng),這些請(qǐng)求接收者將逐個(gè)執(zhí)行業(yè)務(wù)方法,完成對(duì)請(qǐng)求的處理。此時(shí),我們可以通過(guò)命令隊(duì)列來(lái)實(shí)現(xiàn)。
命令隊(duì)列的實(shí)現(xiàn)方法有多種形式,其中最常用、靈活性最好的一種方式是增加一個(gè) CommandQueue 類,由該類來(lái)負(fù)責(zé)存儲(chǔ)多個(gè)命令對(duì)象,而不同的命令對(duì)象可以對(duì)應(yīng)不同的請(qǐng)求接收者,CommandQueue 類的典型代碼如下所示:
import java.util.*;
class CommandQueue {
//定義一個(gè)ArrayList來(lái)存儲(chǔ)命令隊(duì)列
private ArrayList<Command> commands = new ArrayList<Command>();
public void addCommand(Command command) {
commands.add(command);
}
public void removeCommand(Command command) {
commands.remove(command);
}
//循環(huán)調(diào)用每一個(gè)命令對(duì)象的execute()方法
public void execute() {
for (Object command : commands) {
((Command)command).execute();
}
}
}
在增加了命令隊(duì)列類 CommandQueue 以后,請(qǐng)求發(fā)送者類 Invoker 將針對(duì) CommandQueue 編程,代碼修改如下:
class Invoker {
private CommandQueue commandQueue; //維持一個(gè)CommandQueue對(duì)象的引用
//構(gòu)造注入
public Invoker(CommandQueue commandQueue) {
this. commandQueue = commandQueue;
}
//設(shè)值注入
public void setCommandQueue(CommandQueue commandQueue) {
this.commandQueue = commandQueue;
}
//調(diào)用CommandQueue類的execute()方法
public void call() {
commandQueue.execute();
}
}
命令隊(duì)列與我們常說(shuō)的“批處理”有點(diǎn)類似。批處理,顧名思義,可以對(duì)一組對(duì)象(命令)進(jìn)行批量處理,當(dāng)一個(gè)發(fā)送者發(fā)送請(qǐng)求后,將有一系列接收者對(duì)請(qǐng)求作出響應(yīng),命令隊(duì)列可以用于設(shè)計(jì)批處理應(yīng)用程序,如果請(qǐng)求接收者的接收次序沒(méi)有嚴(yán)格的先后次序,我們還可以使用多線程技術(shù)來(lái)并發(fā)調(diào)用命令對(duì)象的 execute() 方法,從而提高程序的執(zhí)行效率。