组合模式 rust和java的实现

建造者模式解析:原理、实现与应用场景 建造者模式是一种创建型设计模式,通过将复杂对象的构建过程与其表示分离,实现分步骤构建不同表现形式的对象。其核心原理是引入导演类控制构建流程,抽象建造者定义接口,具体建造者实现细节。这种模式特别适合配置复杂的对象创建、需要多种表现形式的场景,以及构建不可变对象。在工程实践中,建造者模式能显著提升代码可读性和维护性,常见于电商订单系统、HTTP请求配置等场景。现代实现方式包括流式接口、Lombok注解等变体,结合参数校验和不可变对象特性,能有效提升系统健壮性。 阅读详情

组合模式

组合模式(Composite Pattern),又叫部分整体模式,是用于把一组相似的对象当作一个单一的对象。组合模式依据树形结构来组合对象,用来表示部分以及整体层次。这种类型的设计模式属于结构型模式,它创建了对象组的树形结构。

这种模式创建了一个包含自己对象组的类。该类提供了修改相同对象组的方式。

介绍

  • 意图:将对象组合成树形结构以表示"部分-整体"的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。

  • 主要解决:它在我们树型结构的问题中,模糊了简单元素和复杂元素的概念,客户程序可以像处理简单元素一样来处理复杂元素,从而使得客户程序与复杂元素的内部结构解耦。

  • 何时使用:、
    1、您想表示对象的部分-整体层次结构(树形结构)。 2、您希望用户忽略组合对象与单个对象的不同,用户将统一地使用组合结构中的所有对象。

如何解决:树枝和叶子实现统一接口,树枝内部组合该接口。

应用实例:

  1. 算术表达式包括操作数、操作符和另一个操作数,其中,另一个操作数也可以是操作数、操作符和另一个操作数。

优点: 1、高层模块调用简单。 2、节点自由增加。

缺点:在使用组合模式时,其叶子和树枝的声明都是实现类,而不是接口,违反了依赖倒置原则。

使用场景:部分、整体场景,如树形菜单,文件、文件夹的管理。

实现

我们有一个类 Employee,该类被当作组合模型类。CompositePatternDemo 类使用 Employee 类来添加部门层次结构,并打印所有员工,这样我们就可以实现不同的的部门进行自由组合,实现不同部门之间的即插即用。

组合模式的 UML 图

java

步骤 1
创建 Employee 类,该类带有 Employee 对象的列表。
在这里插入图片描述

Employee.java

import java.util.ArrayList;
import java.util.List;
 
public class Employee {
   private String name;
   private String dept;
   private int salary;
   private List<Employee> subordinates;
 
   //构造函数
   public Employee(String name,String dept, int sal) {
      this.name = name;
      this.dept = dept;
      this.salary = sal;
      subordinates = new ArrayList<Employee>();
   }
 
   public void add(Employee e) {
      subordinates.add(e);
   }
 
   public void remove(Employee e) {
      subordinates.remove(e);
   }
 
   public List<Employee> getSubordinates(){
     return subordinates;
   }
 
   public String toString(){
      return ("Employee :[ Name : "+ name 
      +", dept : "+ dept + ", salary :"
      + salary+" ]");
   }   
}

步骤 2
使用 Employee 类来创建和打印员工的层次结构。

CompositePatternDemo.java

public class CompositePatternDemo {
   public static void main(String[] args) {
      Employee CEO = new Employee("John","CEO", 30000);
 
      Employee headSales = new Employee("Robert","Head Sales", 20000);
 
      Employee headMarketing = new Employee("Michel","Head Marketing", 20000);
 
      Employee clerk1 = new Employee("Laura","Marketing", 10000);
      Employee clerk2 = new Employee("Bob","Marketing", 10000);
 
      Employee salesExecutive1 = new Employee("Richard","Sales", 10000);
      Employee salesExecutive2 = new Employee("Rob","Sales", 10000);
 
      CEO.add(headSales);
      CEO.add(headMarketing);
 
      headSales.add(salesExecutive1);
      headSales.add(salesExecutive2);
 
      headMarketing.add(clerk1);
      headMarketing.add(clerk2);
 
      //打印该组织的所有员工
      System.out.println(CEO); 
      for (Employee headEmployee : CEO.getSubordinates()) {
         System.out.println(headEmployee);
         for (Employee employee : headEmployee.getSubordinates()) {
            System.out.println(employee);
         }
      }        
   }
}

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

Employee :[ Name : John, dept : CEO, salary :30000 ]
Employee :[ Name : Robert, dept : Head Sales, salary :20000 ]
Employee :[ Name : Richard, dept : Sales, salary :10000 ]
Employee :[ Name : Rob, dept : Sales, salary :10000 ]
Employee :[ Name : Michel, dept : Head Marketing, salary :20000 ]
Employee :[ Name : Laura, dept : Marketing, salary :10000 ]
Employee :[ Name : Bob, dept : Marketing, salary :10000 ]

rsut

在rust中由于所有权机制,组合模式中如果不使用引用的方法在组合顺序上便有所限制,只能从低级的开始组合,否则进行组合时便会出现所有权报错问题,由于本人代码水平有限没能实现用引用实现的组合模式,只能用转移所有权的方法实现。

use std::fmt;

// 定义雇员
struct  Employee{
    name:String,
    dept:String,
    sal:i32,
    subordinates:Vec<Employee>
}
// 自定义格式化
impl fmt::Display for Employee {
    fn fmt(&self, f: &mut fmt::Formatter) -> std::fmt::Result {
        write!(f,"Employee : Name{}, dept : {} ,salary : {}", self.name,self.dept,self.sal)
    }
}
impl Employee {
    fn add(&mut self,e:Employee) {
        self.subordinates.push(e);
    }
    fn remove(&mut self,e:Employee) {
        self.subordinates.retain(|x| {
            if x.name!=e.name||x.dept==e.dept||x.sal==e.sal{
                return true;
            }
            return false;
        });
    }
    fn get_subordinates(&self) {
        self.subordinates.as_ptr();
    }
    fn new(name:String,dept:String, sal:i32)->Employee{
        Employee { name, dept,sal,subordinates:Vec::new() }
    }
    
}
fn pe(e:&Employee) {
    println!("{}",e);
    if !e.subordinates.is_empty(){
       e.subordinates.iter().for_each(|x| pe(x));
    }
    
}
fn main(){
    let mut ceo=Employee::new(String::from("John"), String::from("CEO"),30000);
    let mut head_sales=Employee::new(String::from("Robert"), String::from("Head Sales"),20000);
    let mut head_market=Employee::new(String::from("Michel"), String::from("Head Marketing"),10000);
    let mut clerk1=Employee::new(String::from("Laura"), String::from("Marketing"),10000);
    head_sales.add(head_market);
    head_sales.add(clerk1);
    ceo.add(head_sales);
    
    pe(&ceo)

}
组合优于继承:Go与Rust的现代编程实践 面向对象编程中的继承机制曾被视为代码复用的银弹,但随着系统复杂度提升,其基类脆弱性和多重继承问题逐渐显现。组合模式通过对象包含而非继承关系,提供了更灵活的代码复用方式,特别适合现代微服务架构和并发编程场景。Go语言通过结构体嵌入实现组合,而Rust则利用trait系统提供类型安全的代码复用。这两种方式都显著降低了系统耦合度,提升了代码的可测试性和维护性。在需要高性能和高并发的现代软件工程中,组合模式已成为替代传统继承的主流方案。 阅读详情

相关推荐

Rust新手必看:如何用impl关键字实现面向对象三大特性(附完整代码示例)

本文面向Rust新手,详细解析如何利用impl关键字实现面向对象编程的封装、继承和多态三大特性。通过结构体封装、Trait定义共享行为以及Trait对象与泛型实现多态等完整代码示例,帮助开发者掌握Rust独特的面向对象设计模式,安全高效地构建应用程序。

weixin_29000991的博客 271

【亲测免费】 Java与Rust结合实例教程:基于java-rust-example项目

Java与Rust结合实例教程:基于java-rust-example项目 1. 项目介绍 该项目**drrb/java-rust-example** 是一个展示如何在Java应用程序中嵌入Rust代码的示例。它旨在示范如何通过JNI(Java Native Interface)桥接两种语言,允许Java调用Rust编写的函数,以及如何将数据结构在两者之间传递。这对于需要性能关键部分的Java应用...

gitblog_00828的博客 738

深入解析多态编程:原理、实现与应用场景

多态(Polymorphism)是面向对象编程的核心特性之一,它允许通过统一的接口处理不同类型的对象,实现代码的高度灵活性和可扩展性。从技术原理来看,多态分为编译时多态(如方法重载)和运行时多态(如方法重写),后者通过虚方法表实现动态绑定。在工程实践中,多态的价值体现在解耦系统组件、支持插件化架构(如IDE插件系统)以及实现策略模式(如电商促销系统)等场景。通过遵循里氏替换原则和依赖倒置原则,开发者可以避免常见的设计陷阱。现代编程语言如Go、Rust等也提供了各具特色的多态实现方式,为软件开发带来了更多可能

weixin_33720078的博客 318

Java与Rust混合编程:通过JNI实现高性能计算模块的集成

Java与Rust混合编程的核心是JNI规范+Rust动态链接库,Rust通过暴露符合JNI命名规则的函数;Rust的内存安全特性(所有权、RAII)解决了传统JNI(C/C++)的内存泄漏问题;计算密集型逻辑优先用Rust实现,结合OpenBLAS/rayon等库,性能远超Java原生。

2601_94871597的博客 354

探索 JNI - Rust 与 Java 互调实战

本文从原理介绍出发,实现了 Rust 与 Java 的互调。利用 JNI 技术,可以充分发挥 Rust 的性能优势,同时保持 Java 的跨平台特性。这种技术组合适用于对性能要求较高的应用场景,如图像处理、数据分析和系统级编程等。

举世誉之而不加劝,举世非之而不加沮,定乎内外之分,辩乎荣辱之境,斯已矣。 2317

三大主流交易接口实战指南:XTP、CTP与数字货币API的实盘接入解析

本文深入解析了量化交易系统实现实盘交易的关键环节,聚焦于三大主流交易接口的实战接入。详细介绍了证券领域的XTP、期货领域的CTP以及数字货币交易所API的核心特性、代码封装要点与风控实践,并提供了多市场接口整合的统一架构方案,为开发者打通量化交易的“最后一公里”提供了一份接地气的实战指南。

win55的博客 1379

Rust 设计原则指南:SOLID、组合优于继承与 Meyer 原则在 Rust 项目中的落地实践

> 本指南以 Rust Design Patterns 仓库(patterns 项目)中 [src/additional_resources/design-principles.md](https://link.gitcode.com/i/9fea7779f68941cb7a07c42fda737519) 为骨架,系统梳理了软件工程中最常用的设计原则——从 SOLID 五原则、组合优于继承(CRP

gitblog_00177的博客 413

Matlab PolySpace 静态分析实战:从零搭建嵌入式代码安全防线

本文详细介绍了如何使用Matlab PolySpace进行嵌入式代码静态分析,从环境搭建到实战配置,帮助开发者提前发现内存溢出、未初始化变量等潜在缺陷。通过案例分享和进阶技巧,展示如何提升代码安全性和可靠性,特别适合汽车ECU、医疗设备等安全关键系统开发。

weixin_33701617的博客 602

性能提升300%?Python集成Rust扩展的实战路径全解析,

掌握Python与Rust扩展模块的性能对比,提升程序运行效率300%。适用于高并发、计算密集型场景,通过PyO3构建高性能扩展模块,兼顾Python灵活性与Rust速度优势。实战步骤详解,值得收藏。

PixelStream的博客 703

MAX30102心率血氧传感器

估算AC、DC值的方法如下:找两个波谷点,两个波谷点之间有一个波峰点,两个波谷点相连成一条直线,与Y轴平行的线穿过波峰点会与两个波谷点连接成的直线相交于一点,这个点就是DC点,DC点的Y轴对应值就是直流分量,AC分量的值为波峰点到DC点之间的差值。在医院测量中常用的一种血氧采集方式,如下图所示,光电传感器和光源分别置于手指的两侧,光源穿过手指被另一侧的光电二极管接收,根据光衰减量计算血氧浓度。那么,根据上面的Beer-Lambert 定理,针对测量的具体场景,测量过程的衰减为三层穿透物质衰减量的叠加。

qq_41861711的博客 1万+

STM32CubeMX Nucleo F767ZI 教程(1)

系列文章目录 提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加 例如:第一章 Python 机器学习入门之pandas的使用 提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录系列文章目录前言一、pandas是什么?二、使用步骤1.引入库2.读入数据总结 前言 官网上买了个NUCLEO F767ZI 的开发板,144引脚的芯片,https://www.st.com/content/st_com/zh/products/evaluation-tools/prod

fafuwxm 2029

为什么 Rust 等新兴编程语言集体放弃继承选择组合

在面向对象编程(OOP)的发展历程中,继承是代码复用的核心手段,C++、Java、C# 等编程语言都将其作为核心特性。但是近年来,以 Rust、Go、Swift 为代表的新兴编程语言,却纷纷放弃了类继承机制,转而选择组合模式。这并非偶然,而是开发者在长期实践中,对代码复用、可维护性、灵活性的追求而做出的更优解,今天,我们一起来聊一聊,继承与组合各自的优劣势,以及新兴编程语言放弃继承选择组合的底层逻辑。

github_28443763的博客 900

【超详细】计算机操作系统总结及思维导图(汤子瀛版)

计算机操作系统 一.操作系统引论 1.操作系统的目标和功能 目标 方便性 有效性 提高系统资源利用率 提高系统吞吐量 可扩充性 开放性 作用 OS作为用户与计算机硬件系统之间的接口 命令方式 系统调用方式 图标–窗口方式 OS实现了对计算机资源的抽象 2.操作系统的发展过程 未配置操作系统的计算机系统 人工操作方式 用户独占全机 CPU等待人工操作 严重降低...

圣三一 2万+

北海 - Rust与面向对象(三)

策略模式上节说到,模板方法变化一下就能成策略模式,怎么变化的?且看策略模式典型案例:pub trait Fly { fn fly(&self); } pub trait Quack { fn quack($self); } /// 先以静多态的方式实现 /// 似 trait Fly + Quack就是Duck,只是Fly和Quack独立地变化 struct Duck&...

Rust语言学习交流 1094

使用epiDisplay包中的logistic

其中的logistic.display函数可以用于获取逻辑回归模型的汇总统计信息,包括自变量的优势比和置信区间,以及回归系数的Wald检验的p值。最后,我们使用print函数打印出汇总统计信息。使用epiDisplay包中的logistic.display函数获取逻辑回归模型的汇总统计信息(包括自变量的初始和调整后的优势比及置信区间,回归系数的Wald检验的p值)- R语言。通过使用logistic.display函数,我们可以方便地获取逻辑回归模型的重要统计信息,并对自变量的影响进行解释和推断。

CyberJolt的博客 609

uniapp - 解决报错Error in event handler for “service.requestComponentInfo“: “TypeError: cannot read prop

uniapp,报错,Error in event handler for "service.requestComponentInfo": "TypeError: cannot read properties of undefined (reading 'matches')",h5移动端网页,微信小程序,支付宝小程序,Android安卓,苹果ios,app,nvue,如何解决这个问题,一直报错,uniapp报错Error,都检查了还是报错,怎么解决这个错误,uniapp出现Error in event han

🏆 前端领域优质创作者 6379

Java不支持多继承是缺陷吗?——从多语言对比视角的深度分析

语言多继承支持冲突解决机制设计哲学学习成本实际应用难度C++完全支持虚继承(手动)信任程序员高高Java类单继承+接口多继承强制重写冲突方法安全性优先中中Python支持MRO算法(自动)实用主义中中Ruby不支持(Mixin替代)后include覆盖组合优先低低Go完全不支持无(组合替代)极简主义低低RustTrait多继承显式指定显式安全高高​​关键观察​​​现代语言趋势​。

Rysxt_的博客 1343

SAP-ABAP:BAPI_INSPOPER_RECORDRESULTS 记录检验操作结果更新检验批状态详细解析

SAP-ABAP:BAPI_INSPOPER_RECORDRESULTS 记录检验操作结果更新检验批状态详细解析

baidu_35680696的博客 972

编程语言性能、类型系统与并发模型深度对比

编程语言的性能优化、类型系统和并发模型是现代软件开发的核心考量因素。从执行速度、内存效率到并发能力,不同语言在这些维度上展现出独特优势。Go凭借轻量级goroutine和高效GC在微服务领域表现突出,Rust则通过所有权系统实现内存安全与零成本抽象。类型系统方面,静态类型语言如Java和Kotlin能显著减少运行时错误,而Python的类型提示则为动态语言提供了渐进式类型化方案。并发模型上,从Go的CSP到Rust的异步IO,各语言提供了多样化的解决方案。理解这些底层原理,能帮助开发者根据应用场景(如云原生

weixin_34319111的博客 344

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

Rust所有权机制解析与内存安全实践

内存管理是系统编程的核心问题,所有权机制通过编译期检查确保内存安全。该机制规定每个值有唯一所有者,离开作用域自动释放,转移所有权后原变量失效。相比GC语言的运行时管理,Rust在编译阶段就能捕获悬垂指针、数据竞争等问题。在并发编程中,所有权与借用检查器协同工作,强制明确数据流动路径,避免竞态条件。实践表明,合理运用移动语义、RAII模式能显著提升性能,而Rc/Arc等智能指针解决了共享所有权需求。这些特性使Rust特别适合开发操作系统、浏览器引擎等对安全性和性能要求苛刻的场景。

weixin_32430941的博客 193

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

Rust硬拦截+AI语义研判:构建高可用双层安全风控架构

在API网关与反爬反欺诈场景中,安全风控常面临规则引擎响应滞后、AI模型推理成本高的矛盾。其原理在于将确定性校验与语义理解分层:底层用Rust实现微秒级硬拦截,处理频率限制、签名验证等高频判断;上层用AI进行行为序列与文本语义研判,输出风险分。这种架构兼顾低延迟与泛化能力,可应用于账号安全、内容审核等场景。通过策略层融合两层信号并建立反馈闭环,实现可迭代的风控体系。

weixin_29047919的博客 237

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

六语言规则引擎实现对比:同构架构下的妥协与差异

规则引擎作为业务决策自动化的核心组件,其设计模式与工程落地在多种编程语言中呈现出迥异的实践路径。从架构分层、动态类型到编译期约束,不同语言在实现统一语义时往往需要在表达力、运行时性能与开发效率之间做出权衡。理解这些技术选型背后的原理,有助于团队在构建跨语言SDK或迁移技术栈时规避潜在风险。无论是JavaScript的灵活性、Java的反射开销、Python的GIL限制,还是Go的并发模型与Rust的所有权机制,都直接影响规则匹配的吞吐量和内存表现。本文以边缘计算场景下的多语言引擎实现为切入点,剖析各语言在并

weixin_33851429的博客 391

Apache OpenDAL Lua 绑定依赖全景:Rust 核心依赖、许可证矩阵与 Lua 侧零运行时依赖

Lua 绑定(`bindings/lua`)是 Apache OpenDAL 众多语言绑定中的一员,其依赖结构呈现典型的"双层"形态:底层由 Rust 编译成原生共享库,上层则是纯 Lua 接口。本文以仓库中的 [bindings/lua/DEPENDENCIES.md](https://link.gitcode.com/i/1fb2c41f388fa777daa861636ac153fa) 为线

gitblog_00045的博客 210

【开箱即用】三步把全国1:5万地图数据变成随取随用的底图

做 1:5万 精度底图时,找数据源、清洗格式常要花掉头几天。"全国范围1:5万标准分幅地图数据"直接给了答案:一套覆盖全中国、按经纬度标准分幅的 Shp 数据集,解压完就能进软件用。 ## 📦 数据资产速览:4 个关键参数一屏看完 - **数据格式**:Shp(Shapefile),GIS 里点、线、面要素的通用格式,主流软件都能直接读 - **比例尺**:1:50000,中等尺度地理分析所

gitblog_00205的博客 361

basic-computer-games 项目解析:经典对话式程序 HELLO 的玩法、BASIC 原版与多语言移植实现

HELLO 是《Basic Computer Games》(1978)中为数不多的"对话式程序"(conversational program)示例:它不求解数学题、不玩棋类对弈,而是以幽默口吻扮演一位"万能的计算机顾问",为用户在 SEX、HEALTH、MONEY、JOB 四类问题上分发搞笑建议。本文以 [45_Hello/README.md](https://link.gitcode.com/

gitblog_00302的博客 494

Traits编程:核心概念、实现模式与实战应用

Traits作为一种代码复用机制,在现代编程中扮演着重要角色。其核心原理是通过方法集合的混入(mix in)实现跨类别的功能共享,既保持了接口的灵活性,又能提供具体实现。从技术价值看,Traits能有效解决传统继承导致的类层次复杂问题,并克服接口无法提供默认实现的限制。在应用场景上,特别适用于用户权限系统(如RBAC)、可观测性功能(日志/监控)等需要跨领域复用的场景。通过编译时混入、运行时组合等不同实现模式,Traits在Scala、PHP等多语言生态中展现出强大生命力,其中PHP的traits实现更以其

weixin_29587015的博客 153
上一篇: 外观模式 rust和java的实现
下一篇: rust 笔记 高级错误处理
过去日记
过去日记 新星创作者: 后端开发技术领域 新星创作者: 后端开发技术领域
博客等级 码龄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、付费专栏及课程。

余额充值