Java命令模式(行为型设计模式)

Java中的23个设计模式 【行为型模式】 中的 【命令模式】 阅读详情

概述

日常生活中,我们出去吃饭都会遇到下面的场景。

定义:

将一个请求封装为一个对象,使发出请求的责任和执行请求的责任分割开。这样两者之间通过命令对象进行沟通,这样方便将命令对象进行存储、传递、调用、增加与管理。

结构

命令模式包含以下主要角色:

* 抽象命令类(Command)角色: 定义命令的接口,声明执行的方法。
* 具体命令(Concrete  Command)角色:具体的命令,实现命令接口;通常会持有接收者,并调用接收者的功能来完成命令要执行的操作。
* 实现者/接收者(Receiver)角色: 接收者,真正执行命令的对象。任何类都可能成为一个接收者,只要它能够实现命令要求实现的相应功能。
* 调用者/请求者(Invoker)角色: 要求命令对象执行请求,通常会持有命令对象,可以持有很多的命令对象。这个是客户端真正触发命令并要求命令执行相应操作的地方,也就是说相当于使用命令对象的入口。

案例实现

将上面的案例用代码实现,那我们就需要分析命令模式的角色在该案例中由谁来充当。

服务员: 就是调用者角色,由她来发起命令。

资深大厨: 就是接收者角色,真正命令执行的对象。

订单: 命令中包含订单。

类图如下:

 代码如下:

/**
 * @author: xuzhilei
 * @create: 2022-01-18
 * @description: 订单类
 **/
public class Order {
    /**
     * 餐桌号
     */
    private int diningTable;
    /**
     * 记录餐名和份数
     */
    private Map<String,Integer> foodDic = new HashMap<>();

    public int getDiningTable() {
        return diningTable;
    }

    public void setDiningTable(int diningTable) {
        this.diningTable = diningTable;
    }

    public Map<String, Integer> getFoodDic() {
        return foodDic;
    }

    public void setFoodDic(String name,int num) {
        foodDic.put(name,num);
    }
}
/**
 * @author: xuzhilei
 * @create: 2022-01-18
 * @description: 命令接口
 **/
public interface Command {
    /**
     * 命令执行方法
     */
    void execute();
}
/**
 * @author: xuzhilei
 * @create: 2022-01-18
 * @description: 具体命令类
 **/
public class OrderCommand implements Command{
    /**
     * 持有订单对象
     */
    private Order order;
    /**
     * 持有厨师对象,即命令接收者对象
     */
    private SeniorChef seniorChef;

    public OrderCommand(Order order, SeniorChef seniorChef) {
        this.order = order;
        this.seniorChef = seniorChef;
    }

    /**
     * 具体执行方法
     */
    @Override
    public void execute() {
        System.out.println(order.getDiningTable()+" 桌的订单:");
        Map<String, Integer> foodDic = order.getFoodDic();
        for (Map.Entry<String, Integer> entry : foodDic.entrySet()) {
            seniorChef.makeFood(entry.getKey(), entry.getValue());
        }
        try {
            //停顿一下,模拟做饭过程
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println(order.getDiningTable() + " 桌的饭弄好了 ");

    }
}
/**
 * @description: 厨师类
 **/
public class SeniorChef {
    /**
     * 模拟制作食物的方法
     * @param foodName 食物名称
     * @param num 份数
     */
    public void makeFood(String foodName,int num){
        System.out.println(num + "份" + foodName);
    }
}
/**
 * @description: 服务员类
 **/
public class Waiter {
    /**
     * 可以持有多个命令
     */
    private List<Command> commandList;

    public Waiter(){
        commandList = new ArrayList<>();
    }

    public void setCommand(Command command){
        commandList.add(command);
    }

    /**
     * 发出命令,给厨师下订单
     */
    public void orderUp(){
        System.out.println("叮咚,大厨,新订单来了.......");
        for (Command command : commandList) {
            if (command != null){
                command.execute();
            }
        }
    }

}
/**
 * @description: 测试
 **/
public class Client {
    public static void main(String[] args) {
        //创建订单对象
        Order order = new Order();
        order.setDiningTable(1);
        order.setFoodDic("西红柿鸡蛋面",1);
        order.setFoodDic("小杯可乐",2);

        Order order1 = new Order();
        order1.setDiningTable(2);
        order1.setFoodDic("尖椒肉丝盖饭",1);
        order1.setFoodDic("小杯雪碧",1);

        //创建接收者对象(厨师)
        SeniorChef receive = new SeniorChef();
        //将订单和接收者封装成命令对象
        OrderCommand orderCommand = new OrderCommand(order,receive);
        OrderCommand orderCommand1 = new OrderCommand(order1,receive);
        //创建调用者(服务员)并持有命令
        Waiter waiter = new Waiter();
        waiter.setCommand(orderCommand);
        waiter.setCommand(orderCommand1);
        //将订单命令带到柜台给厨师下订单
        waiter.orderUp();
    }
}

测试结果:

优缺点

1,优点:

* 降低系统的耦合度。命令模式能将调用操作的对象与实现该操作的对象解耦。
* 增加或删除命令非常方便。采用命令模式增加与删除命令不会影响其他类,它满足“开闭原则”,对扩展比较灵活。
* 可以实现宏命令。命令模式可以与组合模式结合,将多个命令装配成一个组合命令,即宏命令。
* 方便实现 Undo 和 Redo 操作。命令模式可以与后面介绍的备忘录模式结合,实现命令的撤销与恢复。

2,缺点:

* 使用命令模式可能会导致某些系统有过多的具体命令类。
* 系统结构更加复杂。

使用场景

* 系统需要将请求调用者和请求接收者解耦,使得调用者和接收者不直接交互。
* 系统需要在不同的时间指定请求、将请求排队和执行请求。
* 系统需要支持命令的撤销(Undo)操作和恢复(Redo)操作。


JDK源码解析

Runable是一个典型命令模式,Runnable担当命令的角色,Thread充当的是调用者,start方法就是其执行方法

//命令接口(抽象命令角色)
public interface Runnable {
	public abstract void run();
}

//调用者
public class Thread implements Runnable {
    private Runnable target;
    
    public synchronized void start() {
        if (threadStatus != 0)
            throw new IllegalThreadStateException();

        group.add(this);

        boolean started = false;
        try {
            start0();
            started = true;
        } finally {
            try {
                if (!started) {
                    group.threadStartFailed(this);
                }
            } catch (Throwable ignore) {
            }
        }
    }
    
    private native void start0();
}

会调用一个native方法start0(),调用系统方法,开启一个线程。而接收者是对程序员开放的,可以自己定义接收者。

CCC数字钥匙3.0标准解读(16) 介绍通信过程最重要部分:身份认证和加密.介绍需要身份认证的过程和需要加密的数据及过程. 阅读详情

相关推荐

信道估计之MMSE算法

信道估计之MMSE算法前言MMSE估计的原理总结 前言        前篇分析了LS信道估计算法,也说明了由于没有考虑SNR的影响,所以LS算法不适合在低信噪比的情况下使用。本篇来学习信道估计的另外一种常用的算法–MMSE。        为什么说LS没有考虑噪声大小的情况呢,因为LS算法使用的是实际观测量与估计观测量的误差,这并不能精确的代表估计量的真值与估计值的误

大白的博客 2万+

设计模式(行为型模式)之:命令模式(Command Pattern)

命令模式是一个高内聚的模式,其定义为:将一个请求封装成一个对象,从而让你使用不同的请求把客户端参数化,对请 求排队或者记录请求日志,可以提供命令的撤销和恢复功能。Receiver接受者角色:该角色就是干活的角色,命令传递到这里是应该被执行的Command命令角色:需要执行的所有命令都在这里声明Invoker调用者角色:接收到命令,并执行命令命令模式的意图是将一个请求封装成一个对象,从而使您可以用不同的请求对客户进行参数化。

u013921164的博客 4581

RT-Thread NANO V4.1.1 在Cortex-M0上移植踩坑记:解决内存分配宏导致的线程创建失败

本文详细记录了RT-Thread NANO V4.1.1在Cortex-M0平台移植过程中遇到的内存分配宏配置问题,导致线程创建失败的解决方案。通过分析内存管理算法宏定义,将RT_USING_SMALL_MEM替换为RT_USING_SMALL_MEM_AS_HEAP,成功解决了线程创建问题,为开发者提供了实用的移植经验。

weixin_29189373的博客 306

JAVA设计模式--命令模式

目录 一、什么是命令式 二、命令模式的适用性 三、命令模式的结构 四、命令模式的优点 五、认识命令模式 六、总结 一、什么是命令式 命令(Command)模式又叫作动作(Action)模式或事务(Transaction)模式,是一种对象的行为模式。将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤消的操作。 命令模式的本质:封...

pengjunlee的博客 5万+

Silvaco Atlas(五)——物理模型总结

物理模型总结

qsz1425AWD2121的博客 2149

鲁棒优化入门(一)——工具箱Xprog和RSOME的安装与使用

Xprog是由新加坡国立大学的Peng Xiong于2016年发布的一款matlab工具箱,可以用于求解确定性优化、随机优化、鲁棒优化和分布式鲁棒优化问题。 还有一个针对鲁棒随机优化设计的matlab工具箱——RSOME(Robust Stochastic Optimization Made Easy),也可以用来解决一般的线性规划、随机规划、鲁棒优化和数据驱动的分布式鲁棒优化问题。...............

配电网和matlab的博客 1万+

设计模式第19讲——命令模式(Command)

命令模式(Command Pattern)是一种行为型设计模式,又叫动作模式或事务模式。一、什么是命令模式 二、角色组成 三、优缺点 四、应用场景 4.1 生活场景4.2 java场景五、代码实现5.0 UML类图 5.1 抽象命令(Command)——Command5.2接收者(Receiver)——Chef5.3具体命令(Concrete Command)——OrderCommand六、总结

让~学习~成为一种习惯(橡 皮 人の技术博客) 1万+

【机械臂算法】基于最小惯性参数集的动力学辨识仿真实践

本文深入探讨了机械臂动力学参数辨识的核心挑战与解决方案,重点阐述了基于最小惯性参数集的理论与方法。通过分析PUMA560实例,详细介绍了利用QR分解法或符号推导法获取可辨识参数集,并系统讲解了从激励轨迹设计、仿真数据采集、线性系统求解到模型验证的完整实践流程,为高精度动力学建模与控制奠定了坚实基础。

weixin_29054399的博客 376

设计模式-命令模式(Command)

命令模式是一种数据驱动的设计模式,它属于行为型模式。请求以命令的形式包裹在对象中,并传给调用对象。调用对象寻找可以处理该命令的合适的对象,并把该命令传给相应的对象,该对象执行命令。命令模式的主要优点是可以将请求封装成一个对象,从而使您可以用不同的请求对客户进行参数化。主要解决在软件系统中,行为请求者与行为实现者通常是一种紧耦合的关系,但某些场合,比如需要对行为进行记录、撤销或重做、事务等处理时,这种无法抵御变化的紧耦合的设计就不太合适。

miaoyl的博客 2944

11 指挥AI写C语言/嵌入式基础代码,适配硬件与底层逻辑

本文为《30天掌控AI编程:从指令到落地,手把手教你指挥AI写代码》系列第十一篇,正式进入第三阶段多场景实战环节。聚焦**C语言/嵌入式基础代码**生成,结合嵌入式开发的核心需求,讲解如何精准编写指令,指挥AI生成适配硬件、贴合底层逻辑的C语言代码,覆盖嵌入式常用底层功能、硬件适配要点、代码规范,搭配完整指令模板、AI输出示例与实操校验方法,零基础也能快速指挥AI完成嵌入式基础开发,无需死记硬背C语言底层语法。

coreopt的博客 139

【电子通识】TINA-TI怎么使用受控源向导创建受控源

TINA-TI怎么使用受控源向导创建受控源

一点硬件 357

设计模式之【命令模式】,方法调用的花式玩法

命令模式(Command Pattern)是对命令的封装,每一个命令都是一个操作:请求的一方发出请求要求执行一个操作;接收的一方收到请求,并执行操作。命令模式解耦了请求方和接收方,请求方只需请求执行命令,不用关心命令是怎样被接受,怎样被操作以及是否被执行等。命令模式属于行为型模式。原文:将一个请求封装成医德对象,从而让你使用不同的请求把客户端参数化,对请求排队或者记录请求日志,可以提供命令的撤销和恢复功能。在软件系统中,行为请求者与行为实现者通常是一种紧耦合关系,因为这样的实现简单明了。

秃了也弱了 3751

Fiori Elements 从入门到精通开发教程的文章目录

Fiori Elements 开发技术相对 SAP 其他历史悠久,发展成熟的开发技术来说,是一个新事物。正因如此,迄今为止国内深入讲解 Fiori Elements 应用的中文材料几乎没有。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 4702

【Java 设计模式】行为型之命令模式

命令模式是一种行为型设计模式,用于将请求封装为对象,使得可以参数化客户端对象,并且能够排队、记录请求,以及支持撤销操作。命令模式的核心思想是将请求发送者和接收者解耦,通过命令对象来封装请求。命令对象包含了执行请求的方法,通过这种方式实现了请求的发起和执行的解耦。命令模式通常包含四个主要角色:命令(Command)、具体命令(Concrete Command)、命令发送者(Invoker)、命令接收者(Receiver)。声明了执行请求的接口实现了命令接口,对具体的请求进行了封装。

好久不见的流星 2033

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

设计模式(Design Pattern) - 行为型模式(Behavioral Pattern) - 命令模式(Command) - Java实现

设计模式(Design Pattern) - 行为型模式(Behavioral Pattern) - 命令模式(Command) 目的:达到命令的发出者和执行者之间解耦,实现请求和执行分开。一、说明: 1、Command 命令(接口); 2、Receiver 命令接收者; 3、MyCommand 命令.实现类; 4、Invoker 命令发送者。二、Java实现,代码如下: 1、Comm

Z 392

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

Java设计模式:行为型模式→命令模式

Java设计模式:行为型模式→命令模式 详解

专注分享技术、实用优质教程、资源 1217

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

Java设计模式【命令模式】-行为型

命令模式(Command Pattern)是一种行为型设计模式,它将一个请求封装为一个对象,从而使我们可以用不同的请求对客户端进行参数化,并且支持请求的排队、记录日志以及撤销、重做等功能。命令模式将请求的发送者与执行者分离,使两者独立变化。命令(Command):定义执行命令的接口,通常包含一个execute()方法。具体命令(Concrete Command):实现命令接口,负责调用接收者的相关操作。接收者(Receiver):执行具体操作的逻辑。调用者(Invoker)

lianyinghhh的博客 1237

Java设计模式 —— 【行为型模式】命令模式(Command Pattern) 详解

命令模式是一个行为模式,它是将一个请求封装为一个对象,使发出请求的责任和执行请求的责任分割开。这样两者之间通过命令对象进行沟通,这样方便将命令对象进行存储、传递、调用、增加与管理。

知唔猪的博客 1458

【Java中23种面试常考的设计模式之命令模式(Command)---行为型模式】

接下来我们要进行学习的是:【Java中23种面试常考的设计模式之命令模式(Command)—行为型模式。Client–Main 创建一个具体命令对象并设定它的接收者。命令模式:请求以命令的形式封装在对象中,并传给调用对象。调用对象寻找可以处理该命令的合适的对象,并把该命令传给相应的对象,该对象执行命令。将”发出请求的对象”和”接收与执行这些请求的对象”分隔开来。好了,到这里【Java中23种面试常考的设计模式之命令模式(Command)—行为型模式】就结束了,23种设计模式持续更新汇总中。

Coder_ljw的博客 504

【玩转23种Java设计模式】行为型模式篇:命令模式

命令模式(Command Pattern)是一种行为型设计模式,它将请求封装成对象,从而使得可以使用不同的请求、队列或日志来参数化其他对象,同时支持可撤销的操作。该模式的核心是将“请求”抽象为独立的对象,这样可以更灵活地设计系统的各个模块。

程序员云帆哥的博客 1455

【Java教程】Day20-14 设计模式:行为型模式——命令模式(Command Pattern)

命令模式(Command Pattern)是一种行为型设计模式,它的核心思想是将请求封装为一个对象,从而使得客户可以通过不同的请求来对调用者进行参数化、排队或记录请求日志,甚至支持撤销操作。在本文中,我们将逐步实现并理解命令模式,探索它的使用场景及优势。

max202011161630的博客 543

设计模式之命令模式

是什么 命令模式(Command Pattern)是一种数据驱动的设计模式,它属于行为型模式。请求以命令的形式包裹在对象中,并传给调用对象。调用对象寻找可以处理该命令的合适的对象,并把该命令传给相应的对象,该对象执行命令。 关键角色 1、received 真正的命令执行对象 2、Command 3、invoker 使用命令对象的入口 应用场景: 在某些场合,比如要对行为进行"记录、撤销/重做、事务...

林木森的博客 212

重学Java设计模式-行为型模式-命令模式

重学Java设计模式-行为型模式-命令模式

qq_53098203的博客 714

23种设计模式-行为型模式之命令模式(Java版本)

命令模式是一种行为型设计模式,它将请求封装成一个对象,从而使你可以使用不同的请求、队列、日志请求以及支持可撤销的操作。命令模式将请求的发送者和接收者解耦,调用者不再直接操作接收者对象,而是通过命令对象来实现。

DreamCollector的博客 499

java设计模式——行为型之命令模式

Command Pattern(命令模式)

Coding tortoise‘s JOY BOOKCASE~ 858

Java设计模式(十五)行为型- 命令模式Command Pattern(史上最全命令模式)与使用场景以及优缺点

命令模式

移动端开发与最新技术 477
上一篇: Java设计模式之策略模式(行为型设计模式)
下一篇: 责任链模式(Java行为型设计模式)
海深不见鲸
博客等级 码龄6年 7粉丝 31原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值