码迷,mamicode.com
首页 > 其他好文 > 详细

设计模式(一):命令模式(3)——命令模式扩展之队列请求

时间:2019-01-30 17:16:42      阅读:184      评论:0      收藏:0      [点我收藏+]

标签:设计模式   nbsp   exec   auth   linked   java   打包   实现   tco   

前言

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

设计模式(一):命令模式(1)——基本的命令模式

设计模式(一):命令模式(2)——命令模式扩展之宏命令

设计模式(一):命令模式(3)——命令模式扩展之队列请求

设计模式(一):命令模式(4)——命令模式扩展之日志请求

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

1.队列请求的工作方式

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

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

下图即是体现:

技术分享图片

2.代码实现

代码地址:https://github.com/wutianqi/desin-patterns/tree/master/design-pattern/src/main/java/com/wutqi/p1/command_pattern/p3/queue

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


    }
}

 

运行结果:

技术分享图片

 

设计模式(一):命令模式(3)——命令模式扩展之队列请求

标签:设计模式   nbsp   exec   auth   linked   java   打包   实现   tco   

原文地址:https://www.cnblogs.com/wutianqi/p/10337875.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!