命令模式介绍及应用案例
命令模式介绍
命令模式(Command Pattern) 是一种行为设计模式,它将请求封装为一个对象,从而使你可以用不同的请求对客户进行参数化,并且支持请求的排队、记录日志、撤销操作等功能。命令模式的核心思想是将“请求”封装成对象,使得请求的发送者和接收者解耦,从而可以灵活地扩展和修改请求的处理逻辑。
命令模式的主要角色:
- Command(命令接口):定义执行操作的接口。
- ConcreteCommand(具体命令):实现命令接口,封装具体的操作。
- Invoker(调用者):持有命令对象,并调用命令的执行方法。
- Receiver(接收者):真正执行命令的对象,负责具体的业务逻辑。
- Client(客户端):创建命令对象并设置其接收者。
命令模式的优点:
- 解耦:将请求的发送者和接收者解耦,使得请求的处理逻辑可以独立变化。
- 扩展性:可以很容易地添加新的命令,而不需要修改现有的代码。
- 支持撤销和重做:通过记录命令的历史,可以轻松实现撤销和重做功能。
- 支持命令队列:可以将命令放入队列中,按顺序执行或延迟执行。
优秀框架中的使用案例
1. Java中的Swing框架
在Java的Swing框架中,命令模式被广泛用于处理用户界面的事件。例如,按钮点击事件的处理就是通过命令模式实现的。
- Command接口:
ActionListener接口。 - ConcreteCommand:具体的
ActionListener实现类,封装了点击按钮时要执行的操作。 - Invoker:
JButton类,负责调用ActionListener的actionPerformed方法。 - Receiver:具体的业务逻辑类,负责执行实际的操作。
JButton button = new JButton("Click Me");
button.addActionListener(e -> {// 这里是具体的业务逻辑System.out.println("Button clicked!");
});
2. Spring框架中的CommandLineRunner
在Spring框架中,CommandLineRunner 接口可以看作是一种命令模式的实现。它允许在Spring应用启动时执行某些特定的命令。
- Command接口:
CommandLineRunner接口。 - ConcreteCommand:实现
CommandLineRunner接口的具体类,封装了在应用启动时要执行的操作。 - Invoker:Spring框架本身,负责在应用启动时调用
CommandLineRunner的run方法。 - Receiver:具体的业务逻辑类,负责执行实际的操作。
@Component
public class MyCommandLineRunner implements CommandLineRunner {@Overridepublic void run(String... args) throws Exception {// 这里是具体的业务逻辑System.out.println("Application started!");}
}
3. Android中的Runnable和Handler
在Android开发中,Runnable 和 Handler 可以看作是一种命令模式的实现。Runnable 封装了要在后台线程中执行的操作,而 Handler 负责调度和执行这些操作。
- Command接口:
Runnable接口。 - ConcreteCommand:实现
Runnable接口的具体类,封装了要在后台线程中执行的操作。 - Invoker:
Handler类,负责调度和执行Runnable的run方法。 - Receiver:具体的业务逻辑类,负责执行实际的操作。
Handler handler = new Handler();
Runnable task = new Runnable() {@Overridepublic void run() {// 这里是具体的业务逻辑System.out.println("Task executed!");}
};
handler.post(task);
4. Node.js中的Commander库
Commander 是Node.js中一个流行的命令行工具库,它使用命令模式来解析和执行命令行参数。
- Command接口:
Command类中的方法(如action)。 - ConcreteCommand:通过
command方法定义的具体命令,封装了要执行的操作。 - Invoker:
Commander库本身,负责解析命令行参数并调用相应的命令。 - Receiver:具体的业务逻辑类,负责执行实际的操作。
const { Command } = require('commander');
const program = new Command();program.command('greet').description('Print a greeting message').action(() => {// 这里是具体的业务逻辑console.log('Hello, World!');});program.parse(process.argv);
总结
命令模式在多种编程语言和框架中都有广泛的应用,特别是在需要解耦请求发送者和接收者、支持撤销和重做、或者需要将请求排队执行的场景中。通过将请求封装为对象,命令模式提供了一种灵活且可扩展的方式来处理复杂的操作流程。
相关文章:
命令模式介绍及应用案例
命令模式介绍 命令模式(Command Pattern) 是一种行为设计模式,它将请求封装为一个对象,从而使你可以用不同的请求对客户进行参数化,并且支持请求的排队、记录日志、撤销操作等功能。命令模式的核心思想是将“请求”封…...
多线程(多线程案例)(续~)
目录 一、单例模式 1. 饿汉模式 2. 懒汉模式 二、阻塞队列 1. 阻塞队列是什么 2. 生产者消费者模型 3. 标准库中的阻塞队列 4. 自实现阻塞队列 三、定时器 1. 定时器是什么 2. 标准库中的定时器 欢迎观看我滴上一篇关于 多线程的博客呀,直达地址…...
python笔记之函数
函数初探 python在要写出函数很简单,通过关键字def即可写出,简单示例如下 def add(a, b):return ab 以上即可以定义出一个简单的函数:接收两个变量a和b,返回a和b相加的结果,当然这么说也不全对,原因就是…...
合合信息大模型加速器2.0实测:当AI开始“读心术“与“考古“
凌晨三点的编辑部,我盯着屏幕上密密麻麻的财务报表和如天书般的专利图纸,感觉咖啡因正在大脑中上演"黑凤凰"式崩溃。这时,合合信息的AI助手突然开口:"您需要的是自动关联32个数据表,还是让模型直接生成…...
一个判断A股交易状态的python脚本
最近在做股票数据相关的项目,需要用到判断某一天某个时刻A股的状态,比如休市,收盘,交易中等,发动脑筋想了一下,这个其实还是比较简单的,这里我把实现方法分享给大家。 思路 当天是否休市 对于某…...
【go】数组与切片
数组Array 重点: 数组是值类型 数组的定义 var 数组名 [数组大小] 数据类型,例如var intArr [5] int,定义完数组后数组里的元素有默认值。、 数组的地址&intArr、&intArr[0]。 数组占据连续的内存。 int通常是4字节(32位&…...
hadoop集群配置-scp命令
scp 命令用于在不同主机之间复制文件或目录,在Hadoop集群配置中常用于将配置文件或相关资源分发到各个节点。以下是 scp 命令的基本用法和在Hadoop集群配置中的示例: 基本语法 scp [-r] [源文件或目录] [目标用户目标主机:目标路径] - -r :…...
闪记(FlashNote):让灵感快速成文的轻量级笔记工具
闪记(FlashNote):让灵感快速成文的轻量级笔记工具 你是否经常遇到这样的情况:桌面上放了一大堆的新建123.txt,想记录一个想法,应该是一键开个一个快捷键然后瞬间记录就自动保存了,现在的很多笔记…...
打车APP订单系统逻辑梳理与实现
一、逻辑分析 打车 APP 订单系统是整个打车业务的核心,负责处理从乘客下单到行程结束的一系列流程,涉及乘客、司机和平台三方的交互。 乘客端 下单:乘客打开 APP,输入上车地点、目的地,选择车型等信息后提交订单。此时…...
《大模型部署》——ollama下载及大模型本地部署(详细快速部署)
ollama Ollama 是一款开源跨平台的大语言模型(LLM)运行工具,旨在简化本地部署和管理 AI 模型的流程。 下载ollama 进入官网下载https://ollama.com/ 选择需要的系统下载 下载完成后直接进行安装 下载大模型 选择想要部署的模型&#…...
【蓝桥杯速成】| 17.完全背包(一维easy版)
题目一:爬楼梯 问题描述 57. 爬楼梯(第八期模拟笔试) 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 每次你可以爬至多m (1 < m < n)个台阶。你有多少种不同的方法可以爬到楼顶呢? 注意:给定 n 是一个正整…...
移动端六大语言速记:第4部分 - 数据结构
移动端六大语言速记:第4部分 - 数据结构 本文对比Java、Kotlin、Flutter(Dart)、Python、ArkTS和Swift这六种移动端开发语言的数据结构特性,帮助开发者快速掌握各语言的语法差异。 4. 数据结构 4.1 数组与列表 各语言数组与列表的语法对比࿱…...
开源鸿蒙分布式软总线技术研究报告
引言 在现代计算环境中,分布式系统的重要性日益凸显,尤其是在物联网(IoT)和无处不在的连接的背景下。各种智能设备数量的爆炸式增长以及用户对跨设备无缝体验的需求,推动了分布式操作系统的发展。开源鸿蒙正是在这样的…...
Geotools结合SLD实现矢量中文标注下的乱码和可用字体解析
目录 前言 一、需求溯源 1、原始的SLD渲染 2、最初的效果 二、问题修复 1、还是字符编码 2、如何选择可用的字体 3、如何查看支持的字体库 三、总结 前言 随着地理信息系统(GIS)技术的不断发展,矢量数据的可视化和标注成为了地理信息展…...
linux 服务器创建服务器启动后服务自启动
1、在/etc/systemd/system/下touch一个文件: touch /etc/systemd/system/your_application.service 2、在文件中写入: [Unit] Descriptionmodules-system Aftersyslog.target[Service] Typeforking Userroot Grouproot ExecStart/bin/bash /usr/loca…...
基于Python与CATIA V5的斐波那契螺旋线自动化建模技术解析
引言 斐波那契螺旋线(Fibonacci Spiral)作为自然界广泛存在的黄金比例曲线,在工业设计、产品造型、机械工程等领域具有重要应用价值。本文将以Python控制CATIA V5进行参数化建模为例,深入解析三维CAD环境中复杂数学曲线的自动化生…...
动态规划(11.按摩师)
题目链接:面试题 17.16. 按摩师 - 力扣(LeetCode) 解法: 状态表示: 对于简单的线性 dp ,我们可以⽤「经验 题⽬要求」来定义状态表⽰: 以某个位置为结尾,巴拉巴拉;…...
CentOS下安装Docker,Docker下安装JDK\MYSQL\REDIS\NGINX
先用VM安装好Centos8.5,可以选择安装迷你版,我安装的是UI版。 然后用MobaXterm_Portable_v23.0_cn连上去,互访成功就可以往下操作。 1. 修改文件:就是要把之前的mirror替换成现在的vault cd /etc/yum.repos.d/sed -i s/mirrorl…...
demo.launch(inbrowser=True, share=True)无法生成共享网址
Gradio 的共享功能无法正常工作,原因是缺少一个名为 frpc_windows_amd64_v0.3 用到代码 app.demo.launch(show_errorTrue, inbrowserTrue, shareTrue) show_errorTrue:这个参数的作用是当应用在启动过程中出现错误时,会显示错误信息。这对于调…...
翻译: 人工智能如何让世界变得更美好二
Basic assumptions and framework 基本假设和框架 To make this whole essay more precise and grounded, it’s helpful to specify clearly what we mean by powerful AI (i.e. the threshold at which the 5-10 year clock starts counting), as well as laying out a fram…...
【vue】editor富文本输入全英文,谷歌浏览器:元素不会自动换行bug
【vue】editor富文本输入全英文,谷歌浏览器:元素不会自动换行bug 解决方案:给元素一个宽度 100% .editor {width: 100%; }...
XML标签格式转换为YOLO TXT格式
针对的是多边形(<polygon>)来描述对象的边界,而不是传统的矩形框(<bndbox>) import xml.etree.ElementTree as ET import os from pathlib import Path# 解析VOC格式的XML文件,提取目标框的标…...
# OpenCV实现人脸与微笑检测:从图像到视频的实战应用
OpenCV实现人脸与微笑检测:从图像到视频的实战应用 在计算机视觉领域,人脸检测和微笑检测是两个非常有趣且实用的任务。它们广泛应用于智能监控、社交媒体分析、人机交互等多个场景。本文将通过两个代码示例,详细介绍如何使用OpenCV实现人脸…...
【ubuntu24.04】挂载windows的共享文件夹
挂载windows的共享文件夹 ubutnu直接挂载windows共享文件夹,这样就能直接访问到windows里下载的文件了。 在 Ubuntu 中挂载 Windows 共享文件夹通常使用 CIFS 协议,下面给出一个常用的方法: 1. 安装 cifs-utils 首先,确保系统…...
基于Python的Django框架的个人博客管理系统
标题:基于Python的Django框架的个人博客管理系统 内容:1.摘要 本文围绕基于Python的Django框架构建个人博客管理系统展开。背景方面,随着互联网发展,个人博客成为信息分享与交流重要平台,传统博客管理系统在功能与灵活性上存在不足。目的是开…...
Kubernetes可视化面板——KubePi(Kubernetes Visualization Panel - kubepi)
Kubernetes可视化管理面板——KubePi 在云计算和容器化的大潮下,Kubernetes 已成为管理容器集群的事实标准。然而,面对复杂的集群管理和运维工作,一个直观、易用的可视化工具显得至关重要。KubePi 正是为此而生——一款专为简化 Kubernetes …...
【区块链安全 | 第二十三篇】单位和全局可用变量(一)
文章目录 单位和全局可用变量(Units and Globally Available Variables)以太单位(Ether Units)时间单位(Time Units)保留关键字 单位和全局可用变量(Units and Globally Available Variables&am…...
6内存泄露问题的讨论
1.关注 内存泄露 是要融入到 DNA 中的事情 内存泄露是一个非常害怕, 非常严重的事情!! (不仅仅是内存泄露,包括文件描述符泄露等同类问题,都是非常严重的) 这种问题,不容易第一时间发现 2.实际场景中:特别是选择性关闭文件描述符 (也是记得要关闭文件描…...
权重参数矩阵
目录 1. 权重参数矩阵的定义与作用 2. 权重矩阵的初始化与训练 3. 权重矩阵的解读与分析 (1) 可视化权重分布 (2) 统计指标分析 4. 权重矩阵的常见问题与优化 (1) 过拟合与欠拟合 (2) 梯度问题 (3) 权重对称性问题 5. 实际应用示例 案例1:全连接网络中的…...
Ludic:用Python构建HTML,告别JavaScript的繁琐开发
在现代Web开发中,构建动态网页和应用程序往往需要同时处理前端JavaScript和后端逻辑,这种复杂性让开发者倍感压力。Ludic框架的诞生,为开发者提供了一种全新的解决方案——通过Python的类型系统和组件化设计,让HTML生成变得简洁高…...
