java命令模式 工作队列_设计模式(一):命令模式(3)——命令模式扩展之队列请求...

前言

命令模式的讲解分为四篇:

一、命令模式扩展——队列请求

1.队列请求的工作方式

上一篇说了命令模式的扩展之宏命令,本节讲解一下命令模式的第二个扩展队列请求。因为命令可以将运算块打包(一个接收者和一组动作),然后将它传来传去,就像是一般的对象一样。现在,即使命令被创建许久之后,运算依然可以被调用。事实上,它甚至可以在不同的线程中被调用,例如工作队列,日程安排,线程池等。

想象有一个工作队列,你再某一端添加命令,然后另一端是线程。线程进行下面的动作:从队列中取出一个命令,调用它的execute()方法,等待这个调用完成,然后将此命令对象丢弃,再取出下一个命令。。。

下图即是体现:

b5d9640946f0bb77a5231a42096da941.png

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();

}

}

}

运行结果:

13f0e60d2e06edc943f119a61e1204cf.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值