当前位置: 首页 > news >正文

【设计模式|行为型】命令模式(Command Pattern)

说明

命令模式(Command Pattern)是一种行为设计模式,它将请求封装为一个对象,以便在不同的请求者和接收者之间进行解耦、参数化和操作的队列化。命令模式允许你将具体的请求封装为对象,这些对象之间彼此独立,并且可以用不同的请求对客户端进行参数化。

结构
  • 命令接口(Command):声明执行命令的方法。
  • 具体命令类(Concrete Command):实现命令接口,负责执行具体的操作。
  • 接收者类(Receiver):包含了具体的操作方法,由具体命令类调用。
  • 请求者类(Invoker):持有命令对象,并在需要时调用命令的执行方法。
工作原理
  1. 创建命令接口,并声明执行命令的方法,如execute()
  2. 创建具体命令类,实现命令接口,并在execute()方法中调用接收者类的具体操作方法。
  3. 创建接收者类,包含了具体的操作方法。
  4. 创建请求者类,持有命令对象,在需要时调用命令的execute()方法。
优点
  • 解耦请求者和接收者:命令模式将请求者和接收者之间解耦,使得它们可以独立变化,互不影响。
  • 可扩展性:可以轻松添加新的命令类和接收者类,而不会影响已有的代码。
  • 可撤销操作:可以通过维护一个命令历史栈,实现对命令的撤销和重做。
缺点
  • 增加了类和对象的数量:引入命令对象和接收者类,会增加系统中的类和对象的数量。
  • 代码结构复杂化:使用命令模式需要定义许多新的类和接口,因此会增加代码结构的复杂性。
使用场景
  • 需要将请求者和接收者解耦,以便能够在不同的请求者和接收者之间进行灵活的变动和组合。
  • 需要支持撤销操作。
  • 需要将一系列的操作队列化,即可以将命令对象存储在列表中,并按顺序执行。

示例

下面以一个简单的股票交易系统为例,介绍命令模式的应用。

假设我们有一个股票交易系统,我们希望实现以下功能:

  • 可以买入股票(BuyStock命令)。
  • 可以卖出股票(SellStock命令)。
  • 可以撤销上一次的交易操作(Undo命令)。

首先,我们定义命令接口Command,声明了一个execute()方法:

public interface Command {void execute();
}

然后,我们创建具体的买入股票命令BuyStockCommand,实现了Command接口:

public class BuyStockCommand implements Command {private StockTrade stockTrade;public BuyStockCommand(StockTrade stockTrade) {this.stockTrade = stockTrade;}public void execute() {stockTrade.buy();}
}

再创建具体的卖出股票命令SellStockCommand,同样实现了Command接口:

public class SellStockCommand implements Command {private StockTrade stockTrade;public SellStockCommand(StockTrade stockTrade) {this.stockTrade = stockTrade;}public void execute() {stockTrade.sell();}
}

接下来,我们创建股票交易类StockTrade,它包含了具体的买入和卖出操作:

public class StockTrade {public void buy() {System.out.println("买入股票");}public void sell() {System.out.println("卖出股票");}
}

最后,我们创建请求者类StockBroker,它持有命令对象,并在需要时调用命令的execute()方法:

public class StockBroker {private Command buyStockCommand;private Command sellStockCommand;private Command undoCommand;public StockBroker(Command buyStockCommand, Command sellStockCommand, Command undoCommand) {this.buyStockCommand = buyStockCommand;this.sellStockCommand = sellStockCommand;this.undoCommand = undoCommand;}public void buyStock() {buyStockCommand.execute();}public void sellStock() {sellStockCommand.execute();}public void undo() {undoCommand.execute();}
}

现在,我们可以创建股票交易系统的实例,并进行操作:

public class CommandExample {public static void main(String[] args) {// 创建股票交易对象StockTrade stockTrade = new StockTrade();// 创建具体的命令对象Command buyStockCommand = new BuyStockCommand(stockTrade);Command sellStockCommand = new SellStockCommand(stockTrade);// 创建请求者对象StockBroker stockBroker = new StockBroker(buyStockCommand, sellStockCommand, buyStockCommand);// 执行买入操作stockBroker.buyStock(); // 买入股票// 执行卖出操作stockBroker.sellStock(); // 卖出股票// 撤销操作stockBroker.undo(); // 买入股票}
}

运行结果如下:

买入股票
卖出股票
买入股票

相关文章:

【设计模式|行为型】命令模式(Command Pattern)

说明 命令模式(Command Pattern)是一种行为设计模式,它将请求封装为一个对象,以便在不同的请求者和接收者之间进行解耦、参数化和操作的队列化。命令模式允许你将具体的请求封装为对象,这些对象之间彼此独立&#xff…...

SqlServer 批量删除表

SqlServer 批量删除表 直接上SQL脚本吧 SELECT row_number()over(order by Name) as FID,Name into #temp FROM SysObjects Where XTypeU --类型,U为实体表 and name like TMP% --表名过滤(自定义就好) ORDER BY Namedeclare count int 0…...

[Linux]线程基本知识

概念 进程 一个正在执行的程序,它是资源分配的最小单位 进程中的事情需要按照一定的顺序逐个进行 进程出现了很多弊端: 一是由于进程是资源拥有者,创建、撤消与切换存在较大的时空开销,因此需要引入轻型进程; 二是由于对称多…...

STM32 串口基础知识学习

串行/并行通信 串行通信:数据逐位按顺序依次传输。 并行通信:数据各位通过多条线同时传输。 对比 传输速率:串行通信较低,并行通信较高。抗干扰能力:串行通信较强,并行通信较弱。通信距离:串…...

页面滚动时隐藏element-ui下拉框/时间弹框

场景 在系统中,当(有垂直滚动时)点击下拉框后滚动页面,会发现下拉项会遮盖住页面中的元素,不会隐藏 解决:(以vue为例) 在页面滚动或者缩放时隐藏下拉项即可(借助点击目标元素,下…...

C#中i++和++i的底层原理

一:前言 我们都知道,i是先取值,后计算。i是先计算,后取值。下面说下它的底层原理 二:原理 int i 0; i; Console.WriteLine(i); 结果是1 执行步骤是: 1.将常量0压入栈中 2.从栈中取出元素0,局…...

在win10下安装verilator

主要参考文章 Verilator简介及其下载安装卸载_徐晓康的博客的博客-CSDN博客https://blog.csdn.net/weixin_42837669/article/details/114505364上面的文章可以解决大部分问题,但是可能是方案有些老了,已经安装最新的版本,下面对最新的版本安装提供解决方案 一 预备工作 安…...

java设计模式-建造者(Builder)设计模式

介绍 Java的建造者(Builder)设计模式可以将产品的内部表现和产品的构建过程分离开来,这样使用同一个构建过程来构建不同内部表现的产品。 建造者设计模式涉及如下角色: 产品(Product)角色:被…...

iOS开发-实现获取下载主题配置动态切换主题

iOS开发-实现获取下载主题配置动态切换主题 iOS开发-实现获取下载主题配置更切换主题,主要是通过请求服务端配置的主题配置、下载主题、解压保存到本地。通知界面获取对应的图片及颜色等。 比如新年主题风格,常见的背景显示红色氛围图片、tabbar显示新…...

react经验4:动态组件

什么是动态组件&#xff1f; 在页面的一小块区域切换显示不同的组件 实现方法 1.声明示例组件 //写在component1.tsx中 const Component1()>{return (<div>组件1</div>) } //写在component2.tsx中 const Component2()>{return (<div>组件2</div…...

Java maven的下载解压配置(保姆级教学)

mamen基本概念 Maven项目对象模型(POM)&#xff0c;可以通过一小段描述信息来管理项目的构建&#xff0c;报告和文档的项目管理工具软件。 Maven 除了以程序构建能力为特色之外&#xff0c;还提供高级项目管理工具。由于 Maven 的缺省构建规则有较高的可重用性&#xff0c;所以…...

Java课题笔记~数据库连接池

一、数据库连接池 1.1 数据库连接池简介 数据库连接池是个容器&#xff0c;负责分配、管理数据库连接(Connection) 它允许应用程序重复使用一个现有的数据库连接&#xff0c;而不是再重新建立一个&#xff1b; 释放空闲时间超过最大空闲时间的数据库连接来避免因为没有释放数…...

设计模式-单例模式

文章目录 单例模式饿汉式单例懒汉式单例懒汉式加锁单例双重锁校验单例静态内部类单例枚举单例 单例模式 单例模式主要是确保一个类在任何情况下都只有一个实例&#xff0c;并提供一个全局访问的点。 主要有以下几种 饿汉式单例 /*** 饿汉式* 类加载到内存后&#xff0c;就实…...

golang mysql

驱动 "github.com/go-sql-driver/mysql"使用到的方法 func sql.Open(driverName string, dataSourceName string) (*sql.DB, error) func (*sql.DB).Prepare(query string) (*sql.Stmt, error)//使用DB.Prepare预编译并使用参数化查询&#xff0c;对预编译的SQL语句…...

uniapp使用echarts

uniapp使用echarts 1.下载资源包2.引入资源包3.代码示例注意事项 1.下载资源包 https://echarts.apache.org/zh/download.html 2.引入资源包 将资源包放入项目内 3.代码示例 <template><div style"width:100%;height:500rpx" id"line" ref&…...

Python命令模式介绍、使用

一、Python命令模式介绍 Python命令模式&#xff08;Command Pattern&#xff09;是一种行为型设计模式&#xff0c;它允许将请求或操作封装在对象中&#xff0c;并将其作为参数传递给调用对象&#xff0c;以在不同的环境中执行相同的请求或操作。 功能&#xff1a; 将请求或…...

#typescript 使用file-saver模块#

场景&#xff1a;前端使用file-saver模块做导出文档的时候&#xff0c;出现两个错误 1&#xff1a;npm run build 提示找不到模块&#xff0c;如图 解决方法&#xff1a; 先卸载&#xff0c;不管是否安装都先要卸载 ,然后安装&#xff1a; npm uninstall file-saver npm…...

移动端适配布局rem和vw

在日益发展的移动互联网时代&#xff0c;作为前端开发者&#xff0c;我们必须了解和掌握各种移动端显示效果的适配技术。在众多适配方案中&#xff0c;使用rem和vw进行布局是当前最为流行和普遍使用的两种技术。通过合理运用这两种技术&#xff0c;我们可以让我们的网页在不同尺…...

【Java基础教程】(四十八)集合体系篇 · 上:全面解析 Collection、List、Set常用子接口及集合元素迭代遍历方式~【文末送书】

Java基础教程之集合体系 上 &#x1f539;本章学习目标1️⃣ 类集框架介绍2️⃣ 单列集合顶层接口&#xff1a;Collection3️⃣ List 子接口3.1 ArrayList 类&#x1f50d; 数组&#xff08;Array&#xff09;与列表&#xff08;ArrayList&#xff09;有什么区别?3.2 LinkedL…...

什么是 DNS ANAME 解析?

本人使用谷歌搜索了简中互联网&#xff0c;完全没有找到任何有关 ANAME 的文章……本文该不会是头一份吧 相信大家对于 DNS 的解析方式都不陌生&#xff0c;常见的有 A、CNAME、MX、TXT 记录等等。其中&#xff0c;网站常用的是 A 记录和 CNAME 记录&#xff1a;A 记录用于将域…...

linux之kylin系统nginx的安装

一、nginx的作用 1.可做高性能的web服务器 直接处理静态资源&#xff08;HTML/CSS/图片等&#xff09;&#xff0c;响应速度远超传统服务器类似apache支持高并发连接 2.反向代理服务器 隐藏后端服务器IP地址&#xff0c;提高安全性 3.负载均衡服务器 支持多种策略分发流量…...

UE5 学习系列(三)创建和移动物体

这篇博客是该系列的第三篇&#xff0c;是在之前两篇博客的基础上展开&#xff0c;主要介绍如何在操作界面中创建和拖动物体&#xff0c;这篇博客跟随的视频链接如下&#xff1a; B 站视频&#xff1a;s03-创建和移动物体 如果你不打算开之前的博客并且对UE5 比较熟的话按照以…...

WordPress插件:AI多语言写作与智能配图、免费AI模型、SEO文章生成

厌倦手动写WordPress文章&#xff1f;AI自动生成&#xff0c;效率提升10倍&#xff01; 支持多语言、自动配图、定时发布&#xff0c;让内容创作更轻松&#xff01; AI内容生成 → 不想每天写文章&#xff1f;AI一键生成高质量内容&#xff01;多语言支持 → 跨境电商必备&am…...

springboot整合VUE之在线教育管理系统简介

可以学习到的技能 学会常用技术栈的使用 独立开发项目 学会前端的开发流程 学会后端的开发流程 学会数据库的设计 学会前后端接口调用方式 学会多模块之间的关联 学会数据的处理 适用人群 在校学生&#xff0c;小白用户&#xff0c;想学习知识的 有点基础&#xff0c;想要通过项…...

算法:模拟

1.替换所有的问号 1576. 替换所有的问号 - 力扣&#xff08;LeetCode&#xff09; ​遍历字符串​&#xff1a;通过外层循环逐一检查每个字符。​遇到 ? 时处理​&#xff1a; 内层循环遍历小写字母&#xff08;a 到 z&#xff09;。对每个字母检查是否满足&#xff1a; ​与…...

如何更改默认 Crontab 编辑器 ?

在 Linux 领域中&#xff0c;crontab 是您可能经常遇到的一个术语。这个实用程序在类 unix 操作系统上可用&#xff0c;用于调度在预定义时间和间隔自动执行的任务。这对管理员和高级用户非常有益&#xff0c;允许他们自动执行各种系统任务。 编辑 Crontab 文件通常使用文本编…...

【SpringBoot自动化部署】

SpringBoot自动化部署方法 使用Jenkins进行持续集成与部署 Jenkins是最常用的自动化部署工具之一&#xff0c;能够实现代码拉取、构建、测试和部署的全流程自动化。 配置Jenkins任务时&#xff0c;需要添加Git仓库地址和凭证&#xff0c;设置构建触发器&#xff08;如GitHub…...

华为OD最新机试真题-数组组成的最小数字-OD统一考试(B卷)

题目描述 给定一个整型数组,请从该数组中选择3个元素 组成最小数字并输出 (如果数组长度小于3,则选择数组中所有元素来组成最小数字)。 输入描述 行用半角逗号分割的字符串记录的整型数组,0<数组长度<= 100,0<整数的取值范围<= 10000。 输出描述 由3个元素组成…...

写一个shell脚本,把局域网内,把能ping通的IP和不能ping通的IP分类,并保存到两个文本文件里

写一个shell脚本&#xff0c;把局域网内&#xff0c;把能ping通的IP和不能ping通的IP分类&#xff0c;并保存到两个文本文件里 脚本1 #!/bin/bash #定义变量 ip10.1.1 #循环去ping主机的IP for ((i1;i<10;i)) doping -c1 $ip.$i &>/dev/null[ $? -eq 0 ] &&am…...

6.计算机网络核心知识点精要手册

计算机网络核心知识点精要手册 1.协议基础篇 网络协议三要素 语法&#xff1a;数据与控制信息的结构或格式&#xff0c;如同语言中的语法规则语义&#xff1a;控制信息的具体含义和响应方式&#xff0c;规定通信双方"说什么"同步&#xff1a;事件执行的顺序与时序…...