设计模式存在哪些关联关系,六种关系傻傻分不清--- UML图示详解

软件设计师下午题备考:数据流图、数据库与UML实战策略 在软件工程实践中,建模能力是衡量开发者抽象思维与系统设计水平的核心指标。通过数据流图(DFD)描述数据流转、利用ER模型抽象现实世界、借助UML可视化系统结构,是需求分析与架构设计的通用方法论。这些技术不仅适用于软件设计师资格考试的下午主观题,更是企业级应用开发中沟通业务与技术的关键桥梁。掌握DFD的父图子图平衡、ER图转关系模式的主外键规范、UML中包含与扩展关系的判别,能够显著提升系统设计的准确性与可维护性。本文从基础概念原理出发,结合历年真题的命题规律,围绕数据流图补全、数据库设计、UML建模、算法填 阅读详情

🚀 优质资源分享 🚀

学习路线指引(点击解锁)知识定位人群定位
🧡 Python实战微信订餐小程序 🧡进阶级本课程是python flask+微信小程序的完美结合,从项目搭建到腾讯云部署上线,打造一个全栈订餐系统。
💛Python量化交易实战💛入门级手把手带你打造一个易扩展、更安全、效率更高的量化交易系统

前言

  • UML俗称统一建模语言。我们可以简单理解成他是一套符号语言。不同的符号对应不同的含义。在之前设计模式章节中我们文章中用到的就是UML类图,UML除了类图意外还有用例图,活动图,时序图。
  • 关于UML如何绘制,这里主要推荐两种方式一种是通过draw.io,另外一种就是Rational Rose这个软件。processon免费版有个数限制

绘制你的第一个UML类图

 public class Person {
     private Integer id;
     private String name;
 ​
     public String getName() {
         return name;
     }
 ​
     public void setName(String name) {
         this.name = name;
     }
 }

  • 现在我给你一个类,假如这个类很抽象别人无法理解或者别人现在不想看代码去理解,你如何快速让别人看懂结构呢?UML就是这个作用。那么对于上面Person类我们该如何绘制类图呢
  • 这个类很简单,一个类名,两个属性,两个方法。我们只要知道UML类图中如何表示类,如何表示属性如何表示方法即可。

image-20220505184816035.png

  • 我们只需要如上表示即可。每个软件显示的风格不一样。我们不需要在意那些细节。有的软件属性和方法前面不全是+号表示的。这里自己注意下就好。总体分位三块,第一块表示类名,第二块表示属性,第三块表示方法

image-20220505185311911.png

类之间关联关系

  • 之前我们学习里氏替换原则的时候有提到我们继承时子类不要改变父类的意图。也是防止我们过度的继承。除此之外我们还有学习接口隔离原则。
  • 关于接口隔离原则主要体现在接口与实现类上。
  • 依赖倒转原则主要也是面向接口编程
  • 还记得我们在讲解开闭原则的时候应为我们图形后期的不断扩张导致我们程序改动特别大。就是因为我们没有处理好类与类的关系。我们的解决思路是将逻辑部分进行转移。各司其职的去做某一件大事。需要相互配合的时候我们当时通过依赖的方式的进行功能的传递的。
  • 上述或多或少我们都接触到了关联关系。今天我们就来好好整理下类与类之间到底存在哪些关系

image-20220505192922336.png

  • 上面六种关系就是类与类之间的关系状态。我这里也将每种关系状态对应的UML表示方式表现出来了。这里申明下我用的是draw.io这个工具。表示的如有错误还请大家指出。
  • 下面我们每两个为一组进行对比学习,这样更有助于我们的理解

依赖&关联

依赖

  • 首先最常见的类关系应该就是依赖了。我的理解依赖是类关系的一种笼统化。甚至其他物种类关系都是依赖的一种特殊情况。
  • 依赖顾名思义就是类中使用到别的类,那么就是依赖关系
 public class DependencyAndRelation {
     private Dependency dependency;
 ​
     public void createRelation(Relation relation) {
 ​
     }
     public Study startStudy() {
         return null;
     }
     public void fav(){
         Eat eat = new Eat();
     }
 }
 class Dependency{}
 class Relation{}
 class Study{}
 class Eat{}

  • 上面代码DependencyAndRelation中分别通过属性方式使用到Dependency;通过入参方式使用到Relation;通过出参方式使用到Study;通过局部变量的方式使用到了Eat ; 上述方式都称为依赖关系。

image-20220506082410599.png

  • 我们通过带箭头的虚线来表示我们的依赖关系,箭头所指被依赖类。通过UML图我们将上述DependencyAndRelation进行绘制。

image-20220506191619560.png

关联

  • 你可能在好奇关联不就是依赖吗。其实我也觉得关联就是依赖。产生关联一定是依赖。存在依赖也一定是关联。这句话没毛病。
  • 但是设计模式大佬们非要较真,那咱也只能按照大佬的意思来理解了。
  • 非要说出个区别来,那就只能指出他们两者的方向性了。依赖在UML种是带箭头的虚线。而关联是一条实线,这应该就是他们之间的区别了。
  • 上面我们也通过案列来说明判定是依赖的三种情况。只要使用过不管是不是永久的都叫做依赖。俗称一日为师终生为师。

image-20220506192636923.png

  • 准确的说关联是存在三种关联关系的,一种是没有方向属于从属关系(实际也是单向关联),双向关联和单向关联。
  • 单向关联就是A种有B,B种无A;
  • 双向关联是AB中互相依赖对方。
  • 到这里你也会发现,这个关联实际上就是依赖关系呀。对!没错,实际就是对依赖的细化。还是上面的代码我们照样可以将虚线箭头

image-20220506193259851.png

泛化&实现

  • 泛化就是对应Java中的抽象;实现对应的Java中的接口。他们两个在UML中都是有三角形箭头指明方向的。
 public class ExtendAndImplent {
 }
 abstract class Happy{
     abstract void sayHi();
 }
 ​
 class TodayHappy extends Happy {
 ​
     @Override
     void sayHi() {
         System.out.println("我今天很开心");
     }
 }
 ​
 interface Operator{
     public void opt();
 }
 ​
 class AddOperator implements Operator {
 ​
     @Override
     public void opt() {
         System.out.println("我会加法");
     }
 }

  • 上面代码很简单就是演示了一下抽象和接口的定义以及各自的子类实现。对应UML类图

image-20220506195336362.png

聚合&组合

  • 剩下就是聚合和组合了。其实真的不是很理解为什么要搞出这么多的名词,徒增烦恼罢了!
  • 聚合更像是一个集体,集体可以解散,解散后个体仍然存在;而组合更像是组装,组装解散后个体的零散零件将会失去整体的意义
  • 比如一个国家有很多人组成,假如国家倒闭了,人还是一样的存在,这就叫聚合;
  • 比如一个猫是由头,爪子,尾巴组成,这些在一起是一只猫,这就叫组合,这里面任何一个脱离了猫都将是残缺的。

image-20220507084435379.png

聚合

 public class AggregationAndComposition {
     public static void main(String[] args) {
         Cat cat = new Cat();
     }
 }
 class Cat{
     private Appendage appendage;
 }
 class Appendage{
 ​
 }

  • 上面这段代码展示的就是聚合的关系。因为对于Cat类来说Appendage并不是必须的。是否是必须的从程序的角度看唯一标准就是是否Appendage随着Cat类一起生成。很显然我们创建了Cat类之后Appendage并没有被创建。

image-20220507084806942.png

  • 聚合是一条带箭头的实现,但是仅仅是带箭头的实线已经表示了单向关联关系了。所以在箭头的另外一侧我们又添加了一个菱形。菱形侧表示聚合的集合。上图中表示Context中包含(依赖)State这个类。包含可能是1个也可能是多个。在菱形侧我们可以通过数字来表示一个还是多个

组合

 public class AggregationAndComposition {
     public static void main(String[] args) {
         Cat cat = new Cat();
     }
 }
 class Cat{
     private Appendage appendage = new Appendage();
 }
 class Appendage{
 ​
 }

  • 在代码层面上只需要将代码稍作修改,聚合的关系就变成了组合。理论上我们知道组合是不可分割的。在代码中翻译过来就是依赖的类一起被创建。
  • 组合和聚合UML也很好区分。聚合是空心菱形,组合是实心菱形。

image-20220507085937563.png

小结

  • 这里需要注意下,图中也指出了聚合和组合的箭头并不是必须的。有没有箭头都是表示聚合或者组合。看个人喜好吧。我个人比较带上箭头比较有方向感。
  • 如果像上面关联一样如果双向聚合呢?理论上是不会出现也不应该出现这种情况的。但是保不齐就有人这么搞。如果真的这样我猜测两端都用对应的菱形表示即可。这时候就没有箭头一说了。

\

AI驱动的数据完整性:ECC到S/4HANA迁移 在SAP ECC到S/4HANA的迁移过程中,数据完整性验证是最复杂且关键的挑战之一。本文介绍了一个全面的AI驱动的端到端数据完整性框架,用于对账事务数据并验证数百万条主数据记录和事务记录的完整性。该框架结合了模式映射、自然语言提示到SQL生成、基于LLM的解决方案、大规模数据对账的数据完整性工具、基于云的测试数据管理以及实时Power BI仪表板,为开发者提供了一个可重复、可扩展的工作流程,确保ERP迁移过程中的数据质量。 阅读详情

相关推荐

从AMCL到SLAM Toolbox:在Nav2中实现高精度纯定位的实践指南

本文详细介绍了从AMCL迁移到SLAM Toolbox纯定位模式的实践指南,帮助开发者在Nav2中实现高精度定位。通过对比AMCL与SLAM Toolbox的性能差异,提供环境配置、参数调优、Nav2集成等关键步骤,显著提升机器人在动态环境中的定位精度和重定位效率。

weixin_29292535的博客 148

UML中的四种关系总结

我们在利用UML对系统进行建模时,常常涉及到四种关系。 一、关联关系

littlecolor 2973

信号完整性仿真SI之Cadence Sigrity SPEED2000_眼图仿真(四)

今天给大家分享一个仿真的操作流程,是关于Cadence Sigrity SPEED2000的时域波形仿真和眼图仿真。我们会经常看见硬件工程师调试示波器上的一些信号的波形变化,其实这些也可以通过仿真电路的搭建来做出投板前的仿真,来优化走线,以减少版本的迭代次数。如果要和实际的信号保持一致,就要求仿真设置的参数和实际的参数保持一致,这也是仿真的重点和难点。下面先让我们了解一下Cadence Sigrity SPEED2000时域仿真的操作流程: 1.仿真模式选择与文件导入 选择Cadence Sigrity下的

刘小同学的博客 1万+

UML中常见的几种关联关系(依赖、泛化、实现、关联、组合、聚合)

由于经常需要画uml图,在这里记录以下类与类之间的关系 类与类之间的j基本关系主要分为: 依赖(Dependency) 泛化(Generalization) 实现(Interface Realization) 关联(Association) 聚合(Aggregation) 组合(Combination) 1.依赖:一个类依赖于另外一个类,方向是单向的。依赖一般是一个类作为另外一个类得属性,通过mehod的方式。例如:我一次只吃一种食物,但是食物有很多种,不同食物将会通过同一个method传递给我这个类。

weixin_42377288的博客 7171

Xilinx Vitis arm-xilinx-eabi-gcc.exe: error: *.c: Invalid argument

This problem may be a bugof version 2021.1 only. Unfortunately, I'm just currently using this version. After Build Project: Find where this Makefile is through "make: Leaving directory" information. For me, it is located atZynq_CPU_wrapper_hw_platfo...

Ayka的博客 6660

软件测试方法——等价类划分法详解

!如果下面这些资料用得到的话可以直接拿走:1、自学开发或者测试必备的完整项目源码与环境2、测试工作中所有模板(测试计划、测试用例、测试报告等)3、软件测试经典面试题4、Python/Java自动化测试实战.pdf5、Jmeter/postman接口测试全套视频获取6、Python学习路线图。

MXB1220的博客 1万+

详解UML中4种关联关系

UML (Unified Modeling Language) 中的关联关系是描述系统中不同元素之间联系的重要概念。其中包括4种主要类型:依赖关系、关联关系、聚合关系和组合关系。让我们通过具体的例子来详细了解这4种关联关系。总的来说,这4种关联关系描述了模型元素之间不同层次和强度的联系。在实际的UML建模过程中,根据具体的需求选择恰当的关系,有助于更好地表达系统的结构和行为。组合关系(Composition)

Less的博客 1648

AIGC在游戏行业的应用:革新游戏开发与体验

AIGC(人工智能生成内容)技术正在深刻改变游戏行业,从开发到体验全面革新。在游戏开发中,AIGC可用于自动生成关卡、角色和剧情,提升开发效率;在资源制作中,通过AI生成场景、角色模型等,降低成本。

1664

UML图讲解(关联关系,单向关联,双向关联,自关联,组合关系,依赖关系,继承关系,实现关系)

UML图讲解,关联关系,单向关联,双向关联,自关联,组合关系,依赖关系,继承关系,实现关系。

jakelihua 1万+

实战分享:如何用本地替换和插桩调试搞定Kasada最新版x-kpsdk-cd环境检测

本文深入解析Kasada最新版x-kpsdk-cd环境检测机制,提供动态请求拦截、本地替换和函数插桩等实战调试策略。通过Proxy保护破解、关键函数断点调试和环境检测对抗方案,帮助逆向工程师有效应对从280位扩展到294位的加密数组挑战,实现高效补环境调试。

weixin_29251567的博客 569

YOLOv8 交通违规检测各个场景的实际应用

本文介绍了基于YOLOv8的交通违规检测系统在不同场景下的应用实现。系统可检测闯红灯、超速、违停和不系安全带等多种违规行为,针对每种场景提供了具体的技术方案和Python实现代码。其中闯红灯检测结合信号灯状态分析,超速检测通过距离时间计算速度,违停检测采用长时间跟踪策略,安全带检测则需更高精度识别。文章还展示了如何整合各功能构建综合交通监管系统,并总结了不同应用场景的技术要点和优化方向,为智能交通管理提供了实用解决方案。

u010117029的博客 299

第5篇:工厂方法 vs 抽象工厂——别再傻傻分不清

摘要:工厂方法和抽象工厂到底有什么区别?本文用对比表格和生活化比喻帮你彻底分清,并给出选型口诀,面试再也不怕被问倒。

折哥|智能物流与Java实战,副高数据库工程师。深耕出版社物流WMS/OMS(线体/立库/VGA),也分享Java进阶与OMS电商对接。Oracle→PG实战派。相信沉淀可迁移能力,分享通用技术,不藏不虚。 170

【Burp入门第二篇】Chrome配置BurpSuite代理教程

1、配置Burp代理为127.0.0.1:80802、扩展商店添加插件switchyomega,修改服务器和端口为下图:3、打开代理,选择刚才添加的代理

等风来 8368

【设计模式】简单工厂?工厂方法?抽象工厂?傻傻搞不清

前言 在刚开始学习设计模式时,工厂设计模式中的简单工厂、工厂方法、抽象工厂可能总是傻傻分不清,今天这篇文章就来帮助你了解一下这三种模式(严格来说,简单工厂并不算一种设计模式)到底是啥? 文章目录前言创造型设计模式1. 简单工厂1.1 模式中包括的类1.2 基本示例1.3 优缺点2. 工厂方法设计模式2.1 模式中包括的类2.2 UML图2.3 功能及应用场景2.4 基本示例2.5 优缺点3. 抽象工厂设计模式3.1 模式中包括的类3.2 UML图3.3 功能及应用场景3.4 基本示例3.5 优缺点3.6 工

aaa_hao的博客 772

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

【无标题】别怕画图!给代码新手的UML极简生存手册:看懂这4张图,沟通设计不再慌

台上的大佬侃侃而谈“领域模型”、“时序逻辑”、“设计模式”,PPT上全是各种框框线线箭头(后来知道那叫类图、时序图)。后来才明白,UML图的目的是沟通,不是存档!表示“部分”可以属于多个“整体”,生命周期独立 (比如`Computer`(整体) 有 `Mouse`(部分),鼠标可以换到另一台电脑)。表示“部分”完全属于“整体”,生命周期一致 (比如`Window`(整体) 关闭时,里面的`Button`(部分) 也被销毁)。类(Class):矩形框,分三层:`类名`、`属性(变量)`、`方法(函数)`。

2401_84492384的博客 348

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

第7篇:策略模式 vs 状态模式——别再傻傻分不清

摘要:策略模式和状态模式是面试中极容易混淆的一对。本文用对比表格和记忆口诀帮你彻底分清。

折哥|智能物流与Java实战,副高数据库工程师。深耕出版社物流WMS/OMS(线体/立库/VGA),也分享Java进阶与OMS电商对接。Oracle→PG实战派。相信沉淀可迁移能力,分享通用技术,不藏不虚。 182

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

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

软件中级设计师 - 面向对象开发

软考 - 面向对象开发

laity__c的博客 487

那些容易混淆的设计模式,了解一下~

好文推荐: 作者:RicardoMJiang 转载地址:https://juejin.cn/post/7030415720676589581 前言 了解过设计模式的同学都知道,设计模式家族成员非常庞大,具体可以分为3类共23种设计模式 对我们来说,设计模式在种类上实在是有些多了,而且很多设计模式非常类似,让人傻傻分不清 本文主要介绍一些容易混淆的设计模式,以加深对设计模式的理解 本文主要包括以下内容 六大设计原则的介绍 简单工厂、工厂方法与抽象工厂模式的区别 代理,装饰与适配器模式的区别 策略、状态与.

鸿蒙开发知识记录 530

设计模式-代理模式和装饰者模式

代理模式和装饰者模式

u013398960的博客 958

网盘直链下载指南:免客户端拿到九大网盘的真实文件地址

网盘网页下载总是这样:小文件拖沓、大文件缓慢、分享页只给"先转存"。真正的卡点在于,"下载"按钮背后的地址并不是文件真实存放的位置。**网盘直链下载助手**是一款油猴脚本,把网盘文件的真实下载地址(直链)从网页里取出来,交给你选择的下载工具,支持九大平台。 ## 卡住你的地方:从分享链接到文件要绕几道弯 拿到别人发的网盘分享链接,文件落到你硬盘上通常要走三道弯:先转存进自己网盘空间,再打开官方

gitblog_00443的博客 865

设计模式入门(二):策略模式和桥接模式

为什么又是两个模式放在一起呢?因为这两个模式也是非常非常的像,但是他们却分属不同的分类,策略模式属于行为型模式,而桥接模式则属于结构型模式。 首先看两幅UML图 空心三角连线表示继承关系,空心菱形连线表示组合关系(其中有并使用,是其一部分)。可以看到当用面向对象UML表述时,他俩的结构是十分相似的。 但仍然能看到区别,但是这个区别是由内在的区别而反应出来的,并非是其本质的区别。 策略模式的关...

weixin_43464294的博客 216

C++设计模式——迭代器模式

前言 又到年底了,时间真的过的好快啊。最近也非常感伤,总是怀念大学的日子,做梦的时候也常常梦到。梦到大学在电脑前傻傻的敲着键盘,写着代码,对付着数据结构与算法的作业;建立一个链表,遍历链表,打印链表。现在把那个时候声明的链表的头文件拿出来看看: typedef struct tagNode { int value; tagNode *pPre; tagNode

草上爬的博客 3330

设计模式 23 · 收尾总纲:把二十三式串成一张地图

本文是「设计模式拆解」系列的收官之作,通过四个核心板块系统梳理了23种设计模式的应用与精髓。1. 模式在源码中的体现:列举JDK、Spring等框架中设计模式的实际应用(如单例、代理、观察者等),证明模式是优秀框架的通用语言;2. 易混淆模式辨析:总结9组高频易混模式(如工厂vs建造者、代理vs装饰器),强调区分关键在意图而非结构;3. 警惕过度设计:指出模式应针对真实变化而非想象需求,提倡YAGNI原则和渐进式重构;4. 全景知识地图:将23种模式与七大设计原则关联,揭示"组合优于继承""面向接口"等原则

记录后端技术的深水区:MySQL、并发、JVM、分布式。原理为主,实战为辅,能少踩一个坑是一个。 285

【Java中23种面试常考的设计模式之访问者模式(Visitor)---行为型模式】

【Java中23种面试常考的设计模式之访问者模式(Visitor)---行为型模式】通俗来说就是:不同的人对同一件事情有着不同的处理方式。仔细思考一下我们会发现:人对应的Element接口,男人女人就是俩个具体实现类,成功和恋爱的状态就是Visitor,每个状态下对应的不同的是Element具体实现类的不同处理方式,由此对应的是俩个具体Visitor实现类,最后多个Element元素需要我们使用集合来存储。访问者模式:使用了一个访问者类,它改变了元素类的执行算法。

Coder_ljw的博客 575
上一篇: CMake技术总结
下一篇: 如何降低复杂度,用数据库做消息队列的存储?
pythonxxoo
博客等级 码龄5年 337粉丝 670原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值