命令模式 rust和java实现

Rust语言的图形用户界面 Rust是一种系统编程语言,由Mozilla研究院开发。其注重安全性和性能,尤其是在内存管理方面,通过严格的借用检查机制,避免了许多常见的错误,例如空指针和数据竞争。Rust的语法类似于C++,但引入了许多现代编程语言的特性,使得它在编写高性能和并发系统时极具吸引力。 阅读详情

命令模式

命令模式(Command Pattern)是一种数据驱动的设计模式。请求以命令的形式包裹在对象中,并传给调用对象。调用对象寻找可以处理该命令的合适的对象,并把该命令传给相应的对象,该对象执行命令。

介绍

  • 意图:将一个请求封装成一个对象,从而使您可以用不同的请求对客户进行参数化。

  • 主要解决:在软件系统中,行为请求者与行为实现者通常是一种紧耦合的关系,但某些场合,比如需要对行为进行记录、撤销或重做、事务等处理时,这种无法抵御变化的紧耦合的设计就不太合适。

  • 何时使用:当需要先将一个函数登记上,然后再以后调用此函数时,就需要使用命令模式,其实这就是回调函数。

  • 优点:1.类间解耦:调用者角色与接收者角色之间没有任何依赖关系,调用者实现功能时只需调用Command 抽象类的execute方法就可以,不需要了解到底是哪个接收者执行。2.可扩展性:Command的子类可以非常容易地扩展,而调用者Invoker和高层次的模块Client不产生严 重的代码耦合。3.命令模式结合其他模式会更优秀:命令模式可以结合责任链模式,实现命令族解析任务;结合模板方法模式,则可以减少 Command子类的膨胀问题。

  • 缺点:命令模式也是有缺点的,请看Command的子类:如果有N个命令,问题就出来 了,Command的子类就可不是几个,而是N个,这个类膨胀得非常大,这个就需要读者在项 目中慎重考虑使用。

命令模式结构示意图:
在这里插入图片描述

java

我们首先创建作为命令的接口 Order,然后创建作为请求的 Stock 类。实体命令类 BuyStock 和 SellStock,实现了 Order 接口,将执行实际的命令处理。创建作为调用对象的类 Broker,它接受订单并能下订单。

Broker 对象使用命令模式,基于命令的类型确定哪个对象执行哪个命令。CommandPatternDemo 类使用 Broker 类来演示命令模式。

步骤 1
创建一个命令接口。

Order.java

public interface Order {
   void execute();
}

步骤 2
创建一个请求类。
Stock.java

public class Stock {
   
   private String name = "ABC";
   private int quantity = 10;
 
   public void buy(){
      System.out.println("Stock [ Name: "+name+", 
         Quantity: " + quantity +" ] bought");
   }
   public void sell(){
      System.out.println("Stock [ Name: "+name+", 
         Quantity: " + quantity +" ] sold");
   }
}

步骤 3
创建实现了 Order 接口的实体类。

BuyStock.java

public class BuyStock implements Order {
   private Stock abcStock;
 
   public BuyStock(Stock abcStock){
      this.abcStock = abcStock;
   }
 
   public void execute() {
      abcStock.buy();
   }
}

SellStock.java

public class SellStock implements Order {
   private Stock abcStock;
 
   public SellStock(Stock abcStock){
      this.abcStock = abcStock;
   }
 
   public void execute() {
      abcStock.sell();
   }
}

步骤 4
创建命令调用类。

Broker.java
import java.util.ArrayList;
import java.util.List;

 public class Broker {
   private List<Order> orderList = new ArrayList<Order>(); 
 
   public void takeOrder(Order order){
      orderList.add(order);      
   }
 
   public void placeOrders(){
      for (Order order : orderList) {
         order.execute();
      }
      orderList.clear();
   }
}

步骤 5
使用 Broker 类来接受并执行命令。

CommandPatternDemo.java

public class CommandPatternDemo {
   public static void main(String[] args) {
      Stock abcStock = new Stock();
 
      BuyStock buyStockOrder = new BuyStock(abcStock);
      SellStock sellStockOrder = new SellStock(abcStock);
 
      Broker broker = new Broker();
      broker.takeOrder(buyStockOrder);
      broker.takeOrder(sellStockOrder);
 
      broker.placeOrders();
   }
}

步骤 6
执行程序,输出结果:

Stock [ Name: ABC, Quantity: 10 ] bought
Stock [ Name: ABC, Quantity: 10 ] sold

rust

trait Order {
    fn execute(&self);
}
#[derive(Clone)]
struct Stock{
    name:String,
    quantity:i32,
}
impl Stock {
    fn buy(&self) {
        println!("Stock [ Name : {}  Quantity: {}] bought",self.name,self.quantity);
    }
    fn sell(&self) {
        println!("Stock [ Name : {}  Quantity: {}] sold",self.name,self.quantity);
    }
    fn new()->Stock{
        Stock{
            name:"ABC".to_owned(),
            quantity:10
        }
    }
}
// 创建命令实体
struct  BuyStock {
    abc_stock:Stock
}
impl Order for BuyStock {
    fn execute(&self) {
        self.abc_stock.buy();
    }
}
struct  SellStock {
    abc_stock:Stock
}
impl Order for SellStock {
    fn execute(&self) {
        self.abc_stock.sell();
    }
}
// 创建命令调用类。
struct Broker{
    order_list:Vec<Box<dyn Order>>
}
impl Broker {
    fn take_order(&mut self,order:impl Order+ 'static){
        
        self.order_list.push(Box::new(order));
    }
    fn place_orders(&self){
        self.order_list.iter().for_each(|f|f.execute());
    }
    fn  new()->Broker {
        Broker{
            order_list:vec![]
        }
    }
}
fn main(){
    let stock=Stock::new();
   
    let buy=BuyStock{abc_stock:stock.clone()};
    let sell=SellStock{abc_stock:stock.clone()};
    let mut broker=Broker::new();
    broker.take_order(buy);
    broker.take_order(sell);
    broker.place_orders();

}

rust仓库

https://github.com/onenewcode/design.git
本教程项目在bin文件夹下的command.rs文件中

MacTeX+TeXstudio:Macbook配置本地Latex看这一篇就够了 这个博客记录本人在MacBook上配置本地Latex的流程,其中选择的编译环境为MacTeX,编辑器为TeXstudio。采用的原因主要两点:一个是本人配置的原因主要是用来撰写毕业论文,希望能够尽可能简化设置流程,专注内容表达;第二是由于本人还有一个windows系统的笔记本,想要编辑器在专注写作体验的同时在两个系统上能够都适配,从而减少切换效率,故选择此组合。这篇文章介绍并详细记录了本人的安装流程,有相同需求的同志也可借鉴。 阅读详情

相关推荐

在 dell precision 7920 tower CentOS 8 Stream 上安裝nvidia驱动程序、Anaconda

简单记录一下如何在实验室dell precision 7920 tower CentOS 8 Stream上安装nvidia显卡驱动。

chen9046的博客 995

迭代器模式:集合遍历的优雅实现与应用场景

迭代器模式是行为型设计模式中的经典实现,主要用于解耦集合对象的遍历逻辑与内部数据结构。该模式通过抽象迭代器接口(如hasNext()、next()等方法)实现统一访问机制,使客户端无需关心底层是数组、链表还是树形结构。从技术价值看,迭代器模式完美解决了集合遍历中的三大痛点:降低耦合度、支持多种遍历方式、隐藏复杂内部实现。在Java集合框架、数据库结果集遍历、大型文件处理等场景中都有广泛应用。现代编程语言如Java的Stream API、JavaScript的迭代协议、Kotlin的Sequence等,都在迭

weixin_30432579的博客 457

HC-05蓝牙模块详细配置、连接与使用过程

用手按着模块上的按键,再给蓝牙模块上电。当蓝牙模块上的灯慢闪的时候就说明进入了配置模式了。在配置蓝牙的时候一定要将串口助手按这个要求配置:设置波特率 38400,数据位 8 位,停止位 1 位,无校验位,这是固定操作! 根据蓝牙的主从模式进行不同的设置,二者主要区别就在于AT+ROLE这个指令如果这里没返回OK可能有一下几种情况:如果正常返回OK,那就可以进行下一步了 配置蓝牙密码的时候,特别是配置HC05,密码必须加双引号"",否则不能正常设置!!!! 给从机模式蓝牙配置好之后,将蓝牙重

qq_51688022的博客 2万+

每周评论:Quarkus 1.4.1.Final,Leyden项目,Rust的未来等等

Quarkus 1.4.1.Final弃用Java 8 上周,Quarkus 1.4.1.Final引入了一些新功能。 此版本不推荐使用Java 8。 现在建议用户使用Java11。它还引入了一个新的FaaS框架和一种用于构建命令行应用程序的新命令模式。 在此处查看Quarkus的新功能 。 Leyden项目将静态图像引入Java平台和JDK Oracle公司Java平台小组的首席架构...

347

逆向工程实战:手把手教你破解药监局网站的动态数据加载机制(Python+Chrome开发者工具)

本文详细介绍了如何利用Python和Chrome开发者工具逆向破解药监局网站的动态数据加载机制。通过分析Ajax请求、解析JSON响应数据以及处理动态参数,帮助开发者高效采集动态加载内容,适用于爬虫开发与数据分析场景。

weixin_30832143的博客 68

Plant simulation、Flexsim、Automod、Emulate3D、VisuaComponent仿真软件对比

E3D在行业内以展示效果好,入门阶段易学易用人机界面友好,电控仿真连接方便不需要借助其他第三方软件,E3D平台开放度较高用户DIY程度强,数据分析功能针对要评定对象的KPI的可根据项目或者使用者需求进行评定。3.支持导入导出多种格式的文件,比如dwg、dxf、fbx、obj、3ds、step、stp、iges、skp、stl、wrl、 bmp 等等。3.软件自带模型组件库程序代码开放,用户可以引用、修改、拷贝,按照自己的逻辑修改模型,或者创建模型并保存到组件库与别人共享。3. 支持导出布局图片。

qq_43342303的博客 3581

学习新时代编程语言Rust-2安装Rust

上一期我们准备了学习环境,如果你在准备过程中遇到了问题欢迎通过平台给我们留言,这一期我们开始安装 Rust 首先我们打开 Rust 官方网站:rust-lang.org   有同学可能会问:你直接告诉我们怎么安装不就行了,还看什么官方网站? 这里需要向大家说明下在我们的视频里不但是要像大家展示一个语言怎么用,更重要的是向大家展示我们学习一门新语言的方式方法,我觉得学会怎么学习比学会某一门...

一个不安分的程序员 676

实践指南——【SPSS操作解析】线性混合效应模型在重复测量数据中的应用

本文详细解析了线性混合效应模型在重复测量数据分析中的应用,并提供了SPSS操作指南。文章阐述了该模型如何通过区分固定效应与随机效应,有效处理数据非独立性和缺失值问题,从而获得更可靠的统计推断。

oo7890的博客 554

java-koans高级技巧:异常处理、泛型与设计模式的禅修之路

java-koans是一个通过渐进式练习帮助开发者掌握Java语法和编程习惯的框架,它以禅宗"公案"的形式引导学习者通过解决实际问题来深化对Java核心概念的理解。本文将聚焦异常处理、泛型与设计模式这三大高级主题,揭示如何通过java-koans的特殊训练方法,实现从语法掌握到编程思维的蜕变。 ## 异常处理的禅意修炼 🧘‍♂️ 异常处理是Java程序健壮性的基石,java-koans通过精

gitblog_01121的博客 453

基于YOLOv11的军事目标识别系统设计与实现(坦克、舰船检测)

DOTA-v2.0(包含多种军事装备的航拍图像)图片数量:11,268类别:18类,包括坦克、舰船、战斗机等分辨率:800×800~4000×4000HRSC2016(高分辨率舰船检测数据集)图片数量:1,061类别:舰船及子类特点:包含多种视角和复杂背景图片数量:5,000+类别:22种军用飞机标注:精确边界框自建数据集建议收集来源:公开军事演习视频、卫星图像、模拟游戏截图数据增强:模拟不同天气、遮挡、低光照等战场环境。

YOLO 450

用 CDS 作为 Referenced Data Source 开发 SAP Gateway OData 服务,一条更轻的 SEGW 路线

本文介绍了SAP Gateway项目中从传统手工建模到基于CDS View的现代化开发方式转变。主要内容包括: 传统方式需要在SEGW中手动创建Entity Type、Entity Set等元素,并在DPC_EXT中编写大量查询逻辑,存在模型层和业务逻辑重复表达的问题。 7.50版本后,SAP Gateway与ABAP CDS深度集成,可通过SEGW直接引用CDS View作为数据源,自动生成数据模型和SADL读取逻辑,支持完整的OData查询功能。 最佳实践建议通过Consumption View而非直接

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

C++学习避坑指南:环境配置、语法本质与工业级演进路径

C++是一门系统级编程语言,其核心价值在于对内存、硬件和执行时序的精确控制。理解const语义、RAII资源管理、模板元编程和移动语义,本质是掌握编译器优化契约与冯·诺依曼体系的物理约束。现代C++工程实践强调分层夯实——从VS Code跨平台环境配置的ABI陷阱与调试符号细节,到用std::jthread、std::span、std::variant构建可维护系统,再到eBPF内核扩展、AI推理引擎SDK及嵌入式Rust/C混合开发等真实产业方向。技术选型不看GitHub星标数量,而取决于是否匹配目标场景

weixin_30319153的博客 404

【ARFoundation自学04】AR Tracked Image 图像追踪识别与对应类的调用

1.添加组件 2.创建图像识别库 3.创建识别后追踪的物体(UI、模型等)

leoysq的博客 2560

从tmux到herdr:现代终端复用器如何降低多任务管理成本

终端复用器(Terminal Multiplexer)是一种允许多个虚拟终端在单一物理终端窗口中并行运行的技术,其核心原理是通过会话管理和进程分离实现屏幕空间的高效利用与工作状态的持久化。这一技术为开发者带来了显著的价值,能够大幅提升在本地开发、服务器运维及多任务并行处理场景下的工作效率。传统工具如tmux虽然功能强大,但其基于快捷键驱动的交互模式和复杂的配置要求带来了较高的学习门槛。新兴的终端工作区管理器herdr则采用了截然不同的设计哲学,它强调通过鼠标操作和直观命令降低认知负担,提供了开箱即用的美观状

weixin_33971977的博客 297

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

Codex 入门教程:从安装到 Skill 实战

Codex CLI 是 OpenAI 于 2026 年开源的终端 AI 编程智能体,使用 Rust 语言编写,采用 Apache-2.0 开源协议。它不是简单的“聊天写代码”工具,而是一个真正能干活、能操作文件的工程智能体。读取并修改代码文件:理解项目结构,跨文件重构执行终端命令:运行测试、git 操作、构建脚本多步骤自主完成任务:拆解任务并逐步执行,遇到不确定操作暂停确认支持多模态输入:可以传入图片进行分析(例如截图 bug、设计稿、错误信息)

篮球界最会写bug的人;程序猿中打球最菜的人。 3592

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

OpenClaw 管理太复杂?这个开源面板让 AI Agent 运维变成“一键搞定“

基于 Spring Cloud Alibaba + Gateway + Nacos + RocketMQ + Vue & Element 实现的后台管理系统 + 用户小程序,支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能。基于 Spring Boot + MyBatis Plus + Vue & Element 实现的后台管理系统 + 用户小程序,支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能。

芋艿V 608

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

开源AI编程助手Kiro:成本直降3倍,命令行集成Claude API实战

在AI编程助手领域,API调用已成为开发者直接利用大模型能力的核心技术路径。其原理是通过标准接口访问云端模型服务,按实际使用量计费,实现了成本可控与能力解耦。这一模式的技术价值在于打破了传统订阅制的捆绑,让开发者能以更低成本、更高灵活性集成顶尖AI能力。在应用场景上,尤其适合需要频繁进行代码生成、审查、重构的工程实践。本文聚焦于开源命令行工具Kiro,它通过直接调用Anthropic Claude API,实现了相比Claude Code高达3倍的成本优化,并深度演示了如何将其集成到Vim、自动化脚本等开发

weixin_34319111的博客 444

Onejump Edit V4:代码精准跳转工具,提升多项目开发效率

在软件开发中,代码导航与跳转是影响开发效率的核心环节。传统IDE的跳转功能通常局限于单个项目内部,而跨项目、跨技术栈的代码查找往往依赖低效的全局搜索或手动切换,导致上下文切换成本高昂。其技术原理在于构建一个语法感知的静态索引引擎,对工作区代码进行符号级分析,再通过动态路由协议将查询指令精准映射到目标位置,实现从“寻找”到“抵达”的瞬间转换。这一技术为多仓库协作、全栈开发和微服务架构等场景提供了统一的导航入口,能显著减少工具碎片化带来的效率损耗。本文以Onejump Edit V4为例,深入解析其如何通过智能

weixin_30619101的博客 356

Sentinel 与 Hystrix 的对比

Sentinel: 资源(SphU.entry(“resourceName”))只代表埋点,具体的规则(限流、熔断、降级)可以在运行时通过硬编码或配置中心(如 Nacos、Apollo)进行动态下发,无需修改代码。Sentinel(阿里巴巴开源)与 Hystrix(Netflix开源,现已停更)都是微服务架构中用于保障系统高可用与容错的核心组件。Hystrix: 采用命令模式(HystrixCommand),逻辑与配置强绑定。Hystrix: 关注点主要在容错与熔断(快速失败),不具备复杂的流量整形能力。

小识的博客 554
上一篇: elasticsearc DSL查询文档
下一篇: elasticsearch 实战
过去日记
过去日记 新星创作者: 后端开发技术领域 新星创作者: 后端开发技术领域
博客等级 码龄3年 5343粉丝 225原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

过去日记

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值