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

    }
}

运行结果:

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

时间: 2024-10-12 10:19:31

设计模式(一):命令模式(3)——命令模式扩展之队列请求的相关文章

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

前言 命令模式的讲解分为四篇: 设计模式(一):命令模式(1)——基本的命令模式 设计模式(一):命令模式(2)——命令模式扩展之宏命令 设计模式(一):命令模式(3)——命令模式扩展之队列请求 设计模式(一):命令模式(4)——命令模式扩展之日志请求 一.升级遥控器 1.需求 经过上一节的设计,我们的遥控器每个按键都具备了基本的开关功能,还有一个按键具备了撤销功能.但人类都是懒惰的,现在我们想要按下0号插槽的On按钮时就可以将电灯.空调.洗衣机打开,按下0号插槽的Off按钮时就可以将电灯.空调

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

前言 命令模式的讲解分为四篇: 设计模式(一):命令模式(1)——基本的命令模式 设计模式(一):命令模式(2)——命令模式扩展之宏命令 设计模式(一):命令模式(3)——命令模式扩展之队列请求 设计模式(一):命令模式(4)——命令模式扩展之日志请求 一.命令模式扩展之日志请求 1.日志请求的工作方式 上一节介绍了命令模式之队列请求,本节介绍一下另一个扩展——日志请求.某些用用需要将我们所有的动作都记录在日志中,并能在系统死机之后,重新调用这些动作恢复到之前的状态.命令模式能够支持这一点.这些

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

前言 命令模式的讲解分为四篇: 设计模式(一):命令模式(1)——基本的命令模式 设计模式(一):命令模式(2)——命令模式扩展之宏命令 设计模式(一):命令模式(3)——命令模式扩展之队列请求 设计模式(一):命令模式(4)——命令模式扩展之日志请求 一.生活中的命令模式 1.案例 如果将命令模式反映到生活中,遥控器无疑是一个很好的例子.假如我们有如下一个遥控器 这个遥控器有三个插槽(编号为0,1,2),每个插槽对应着要操作的一个电器,插槽所控制的电器这里设置的分别是卧室灯.空调.冰箱,这些电

IOS设计模式之四(备忘录模式,命令模式)

本文原文请见:http://www.raywenderlich.com/46988/ios-design-patterns. 由 @krq_tiger(http://weibo.com/xmuzyq)翻译,如果你发现有什么错误,请与我联系谢谢. 备忘录(Memento)模式 备忘录模式快照对象的内部状态并将其保存到外部.换句话说,它将状态保存到某处,过会你可以不破坏封装的情况下恢复对象的状态,也就是说原来对象中的私有数据仍然是私有的. 如何使用备忘录模式 在ViewController.m中增加

设计模式(十四):Command命令模式 -- 行为型模式

1.概述 在软件设计中,我们经常需要向某些对象发送请求,但是并不知道请求的接收者是谁,也不知道被请求的操作是哪个,我们只需在程序运行时指定具体的请求接收者即可,此时,可以使用命令模式来进行设计,使得请求发送者与请求接收者消除彼此之间的耦合,让对象之间的调用关系更加灵活. 例子1:电视机遥控器 : 遥控器是请求的发送者,电视机是请求的接收者,遥控器上有一些按钮如开,关,换频道等按钮就是具体命令,不同的按钮对应电视机的不同操作. 2.问题 在软件系统中,“行为请求者”与“行为实现者”通常呈现一种“紧

Java进阶篇设计模式之八 ----- 责任链模式和命令模式

前言 在上一篇中我们学习了结构型模式的享元模式和代理模式.本篇则来学习下行为型模式的两个模式, 责任链模式(Chain of Responsibility Pattern)和命令模式(Command Pattern). 责任链模式 简介 责任链模式顾名思义,就是为请求创建了一个接收者对象的链.这种模式给予请求的类型,对请求的发送者和接收者进行解耦.这种类型的设计模式属于行为型模式.在这种模式中,通常每个接收者都包含对另一个接收者的引用.如果一个对象不能处理该请求,那么它会把相同的请求传给下一个接

Java设计模式之八 ----- 责任链模式和命令模式

前言 在上一篇中我们学习了结构型模式的享元模式和代理模式.本篇则来学习下行为型模式的两个模式, 责任链模式(Chain of Responsibility Pattern)和命令模式(Command Pattern). 责任链模式 简介 责任链模式顾名思义,就是为请求创建了一个接收者对象的链.这种模式给予请求的类型,对请求的发送者和接收者进行解耦.这种类型的设计模式属于行为型模式.在这种模式中,通常每个接收者都包含对另一个接收者的引用.如果一个对象不能处理该请求,那么它会把相同的请求传给下一个接

设计模式(五):命令模式

一.定义 将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化:对请求排队或记录请求日志,以及支持可撤销的操作. 我觉得可以这样:将一个请求封装为一个对象,对请求排队或记录请求日志,以及支持可撤销的操作:从而使你可用不同的请求对客户进行参数化: 二.实例:一个遥控面板,两台小家电.一个面板控制两台小家电 2.1  不用命令模式实现 命令发起者:一块遥控器 命令接收者:一堆小家电 小家电接口: public interface ISmallAppliance { int Appid {

跟我学设计模式视频教程——命令模式vs策略模式,唠嗑

课程视频 命令模式vs策略模式 唠嗑 课程笔记 课程笔记 课程代码 课程代码 新课程火热报名中 课程介绍 跟我学设计模式视频教程--命令模式vs策略模式,唠嗑,布布扣,bubuko.com