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

前言

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

设计模式(一):命令模式(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();
        }


    }
}

 

运行结果:

 

posted @ 2019-01-30 16:13  安静的boy  阅读(661)  评论(0编辑  收藏  举报