设计模式(十三)行为型模式---命令模式(command)

文章目录

  • 命令模式简介
  • 结构
  • UML图
  • 具体实现
    • UML图
    • 代码实现

命令模式简介

  • 命令模式(command pattern)也叫动作模式或者事务模式。它是将请求(命令)封装成对象,使得可以用不同的请求对客户端进行参数化,具体的请求可以在运行时更改、排队和记录,它将发出者和 接收者解耦,顺序是: 发出者 --> 命令 --> 接收者。
  • 实际使用:Spring JdbcTemplate 中的execute/query方法、Runnable Thread start()。

结构

  • 1.抽象命令(Abstract Command): 抽象命令是一个接口,定义了执行操作的统一方法。具体的命令类会实现这个接口,并提供执行相应操作的具体逻辑
  • 2.具体命令(Concrete Command):具体命令类实现了抽象命令类,它拥有 接收者对象 ,并通过调用接收者的功能来完成命令要执行的操作。
  • 3.接收者(Receiver): 执行实际命令的类,命令对象会调用接收者的方法来执行请求。
  • 4.调用者(Invoker):持有命令对象,通常是多个,并通过访问命令对象来执行相关请求,他不直接访问接收者。

UML图

在这里插入图片描述

具体实现

例子:餐厅中,服务员(Waiter)点菜,然后厨师(Chef)做菜。

UML图

在这里插入图片描述

代码实现

  • 抽象命令类
package com.xxliao.pattern.behavioral.command.demo;/*** @author xxliao* @description: 抽象命令类接口,定义了执行操作的统一方法* @date 2024/5/25 19:26*/
public interface Command {// 点菜void order();// 取消点菜void cancelOrder();
}
  • 具体命令类
package com.xxliao.pattern.behavioral.command.demo;/*** @author xxliao* @description: 具体命令类,实现了抽象命令接口,通过组合,拥有接收者对象,并通过调用接收者对象的方法来完成命令要执行的操作。* @date 2024/5/25 19:30*/public class OrderCommand implements Command {// 聚合方式 持有 接收者对象private Chef chef;public OrderCommand(Chef chef) {this.chef = chef;}@Overridepublic void order() {chef.cook();}@Overridepublic void cancelOrder() {chef.cancelCooking();}
}
  • 接受者类
package com.xxliao.pattern.behavioral.command.demo;/*** @author xxliao* @description: 接收者类,执行实际命令的类,命令对象会调用接收者的方法来执行请求* @date 2024/5/25 19:28*/
public class Chef {public void cook() {System.out.println("chef process order。。。");}public void cancelCooking() {System.out.println("chef cancel cooking...");}
}
  • 调用者类
package com.xxliao.pattern.behavioral.command.demo;/*** @author xxliao* @description: 调用者类 - 持有命令对象,通常是多个,并通过访问命令对象来执行相关请求,他不直接访问接收者。* @date 2024/5/25 22:40*/
public class Waiter {// 持有命令对象private Command command;public void setCommand(Command command) {this.command = command;}/*** @description  点餐* @author  xxliao* @date  2024/5/25 22:45*/public void takeOrder() {// 服务员收到顾客(客户端)点餐请求System.out.println("服务员收到顾客(客户端)点餐请求");// 执行点餐操作,使用命令对象,实际是具体命令对象去执行,然后调用的是接收者对象Chef相关的执行方法。command.order();}/*** @description  取消点餐* @author  xxliao* @date  2024/5/25 22:46*/public void cancelOrder() {// 服务员收到顾客(客户端)取消点餐请求System.out.println("服务员收到顾客(客户端)取消点餐请求");// 执行取消点餐操作,使用命令对象,实际是具体命令对象去执行,然后调用的是接收者对象Chef相关的执行方法。command.cancelOrder();}
}
  • 测试客户端
package com.xxliao.pattern.behavioral.command.demo;/*** @author xxliao* @description: 命令模式 测试客户端* @date 2024/5/25 22:47*/
public class Client {public static void main(String[] args) {// 创建接收者对象 -- 厨师对象Chef chef = new Chef();// 创建具体命令对象, 然后将接收者对象 当作参数 传入Command orderCommand = new OrderCommand(chef);// 创建调用者对象 -- 服务员Waiter waiter = new Waiter();// 将具体命令对象 传入 调用者对象waiter.setCommand(orderCommand);// 执行相关操作waiter.takeOrder();waiter.cancelOrder();}
}
  • 测试结果
    在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/21072.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

梯度下降: 01.原理与代码实操

1. 简介 梯度下降法(GradientDescent) 算法,不像多元线性回归那样是一个具体做回归任务的算法,而是一个非常通用的优化算法来帮助一些机器学习算法(都是无约束最优化问题)求解出最优解,所谓的通用就是很多机器学习算法都是用梯度下降,甚至深度学习也是用它来求解最优解。…

区块链--Ubuntu上搭建以太坊私有链

1、搭建私链所需环境 操作系统:ubuntu16.04,开虚拟机的话要至少4G,否则会影响测试挖矿时的速度 软件: geth客户端 Mist和Ethereum Wallet:Releases ethereum/mist GitHub 2、安装geth客户端 sudo apt-get update …

Java——常见进制

在计算机领域有四种比较常见的进制,分别是二进制、八进制、十进制和十六进制。 一、二进制(Binary) 二进制(Binary)是一种基数为2的数值系统,仅使用两个符号:0和1。所以它的进位规则就是逢二进…

MYSQL一、MYSQL的了解

一、MySQL概述 1、数据库相关概念 为了方便,我们一般把mysql数据库管理系统简称位mysql数据库 通过可以操作数据库管理系统,然后再通过数据库管理系统操作(数据库)和(数据库里面的数据) 2、当前主流的关系…

第二站:Java——集合框架的深邃海洋(续)

### Java——集合框架的深邃海洋(续) 在我们的Java集合框架探索之旅中,我们已经涉足了基本操作、高级特性,现在让我们深入探讨一些特定场景下的应用和进阶技巧,比如集合的分区操作、分组、并行流的性能考量&#xff0…

视频汇聚EasyCVR平台视图库GA/T 1400协议与GB/T 28181协议的区别

在公安和公共安全领域,视频图像信息的应用日益广泛,尤其是在监控、安防和应急指挥等方面。为了实现视频信息的有效传输、接收和处理,GA/T 1400和GB/T 28181这两个协议被广泛应用。虽然两者都服务于视频信息处理的目的,但它们在实际…

Llama(一):Mac M1芯片运行Llama3

目录 安装Ollama for Mac 下载Llama 3模型 运行Llama3 试用Llama3 在命令行中使用Llama3 背景 本地环境:Mac M1,16GB内存 安装Ollama for Mac 官方地址 https://ollama.com/download/Ollama-darwin.zip 链接: 百度网盘 提取码: 8wqx 下载Llama 3模型 oll…

从国产低代码龙头企业零赛云看零(低)代码在软件开发行业和工业企业的应用趋势

从国产低代码龙头企业零赛云看零(低)代码在软件开发行业和工业企业的应用趋势 --- 什么是零(低)代码?零(低)代码开发完整指南 一、什么是零(低)代码? 零&am…

C项目实战:俄罗斯方块

图形 终端控制代码 (ANSI/VT100) 简介 终端 (控制) 代码是用来控制终端的特殊命令,它可以改变颜色和光标的位置,实现那些无法被程序本身完成的操作。 参考文章:终端控制代码 (ANSI/VT100) Terminal Codes 简介 (转载翻译)_终端代码-CSDN博…

pdb文件名称被修改导致pdb文件加载失败的实战排查案例分享

目录 1、概述 2、问题说明 3、pdb文件加载失败的可能原因有哪些? 4、使用!sym noisy打开pdb加载详情,发现pdb文件名称确实被修改了 5、Windbg是如何知道要加载pdb文件名称的? C软件异常排查从入门到精通系列教程(专栏文章列表…

【html】如何给桌面设置渐变背景,通过HTML代码实现

录制的步骤 可以执行以下操作: 查看录制的步骤以幻灯片放映形式查看录制的步骤查看其他详细信息步骤 下一页 步 1: (‎2024/‎6/‎2 16:32:49) 用户在"项目视图 (列表)"上右键单击(在"G:\背景"中) 对于此步骤,没有保存任何屏幕截图。 上一个 下一页 步 …

linux进程加载和启动过程分析

我们的源代码通过预处理,编译,汇编,链接后形成可执行文件,那么当我们在终端敲下指令$ ./a.out argv1 argv2 后,操作系统是怎么将我们的可执行文件加载并运行的呢? 首先知道,计算机的操作系统的启动程序是写死在硬件上的,每次计算机上电时,都将自动加载启动程序,之后…

Java面试题:请对比synchronized和Lock接口,说明它们的优缺点和适用场景

synchronized关键字和java.util.concurrent.locks.Lock接口都是Java中用于实现线程同步的手段。它们在很多方面有相似之处,但也有一些关键的区别。以下是它们之间的对比: synchronized 优点: 使用简单:使用synchronized关键字可…

Spring Bean Request作用域:深入解析与实战洞察

1. 引言 在Spring框架中,Bean的作用域(Scope)定义了Bean的生命周期和可见性。其中,Request作用域是专为Web应用设计的,它在每个HTTP请求的生命周期内提供一个全新的Bean实例。理解Request作用域的工作机制及其背后的源…

翻译《The Old New Thing》- What a drag: Dragging a Uniform Resource Locator (URL)

What a drag: Dragging a Uniform Resource Locator (URL) - The Old New Thing (microsoft.com)https://devblogs.microsoft.com/oldnewthing/20080312-00/?p23133 Raymond Chen 2008年03月12日 麻烦的拖拽:拖拽统一资源定位符(URL) 简要 …

C++多态-联编

静态联编 静态联编支持的多态性,我们将其称为编译时的多态性,又称为静态的多态性,因为联编的过程是在程序开始执行之前进行的。在编译、连接的过程中,系统可以根据类型匹配等特征确定程序中调用与具体执行函数的关系,…

MySQL入门学习-查询进阶.分页查询

在 MySQL 中,分页查询是一种用于在查询结果中获取特定页面数据的技术。它通常用于处理大量数据的情况,以便将结果分为多个页面进行显示或处理。 以下是关于分页查询的一些关键概念和特点: 1. 分页查询的特点: - 数据量控制&…

识别同一用户

识别来自同一终端的访问技术 使用HTTP访问Web服务器时,会反复地执行页面的迁移和图像的读取等通信处理。而不同的通信都是使用不同的方式进行处理。因此服务器端就不需要对每个终端的状态进行单独的管理,可以降低服务器的负载。 另外,…

python安装phonopy教程

Phonopy 是一个用于计算材料晶格动力学性质的 Python 包。它可以用于计算声子频率、声子态密度、热力学性质等。 安装 Phonopy 步骤 1: 安装依赖项 首先,确保你已经安装了 Python 和 pip。然后,安装一些必要的依赖项: pip install numpy scipy matplotlibPhonopy 还依赖于…

AndroidStudio编译很慢问题解决

如果gradle同步、编译下载很慢,可以换一下仓库阿里云镜像 repositories {maven { url https://maven.aliyun.com/repository/google } maven { url https://maven.aliyun.com/repository/jcenter } maven { url https://maven.aliyun.com/repository/public } goog…