类图的6种关系和golang应用
文章目录
- 1. 依赖和关联
- 1.1 依赖(Dependency)
- 概念
- 类图示例
- 代码示例
- 1.2 关联(Association)
- 概念
- 类图示例
- 代码示例
- 2. 组合和聚合(特殊的关联关系)
- 2.1 聚合(Aggregation)
- 概念
- 类图示例
- 代码示例
- 2.2 组合(Composition)
- 概念
- 类图示例
- 代码示例
- 3. 实现和泛化(代码的重用)
- 3.1 实现(Realization)
- 概念
- 类图示例
- 代码示例
- 3.2 泛化(Generalization)
- 概念
- 类图示例
- 代码示例
1. 依赖和关联
1.1 依赖(Dependency)
概念
- 体现为局部变量、方法的形参,或者对静态方法的调用。
- 如:出行使用汽车,下雨打伞等
- 是一种弱关联关系,也是一种临时关系
类图示例
代码示例
package mainimport "fmt"
//定义人的类
type Person struct {Name string
}
//该类有旅行方法,需要车作为参数
func (p *Person) Travel(car Car) {fmt.Printf("%q 坐着 %q 去旅行", p.Name, car.Name)
}
//定义一个汽车类,它是人的依赖
type Car struct {Name string
}func main() {//实例化一个人guanYu := &Person{Name: "关羽",}//实例化一辆车chiTu := &Car{Name: "赤兔",}//执行人的旅行方法,车的实例作为参数guanYu.Travel(*chiTu)
}
- 输出
"关羽"坐着"赤兔"取旅行
1.2 关联(Association)
概念
- 体现为类的属性,golang中可以表现为结构体的成员
- 如:我的朋友(聚合),人和身体部位(组合),汽车和轮子(组合)
- 是一种强关联关系,也是一种长期关系
类图示例
代码示例
参考下文 聚合、组合
2. 组合和聚合(特殊的关联关系)
2.1 聚合(Aggregation)
概念
- 是关联关系的一种,表示一种弱的“拥有”关系。
- 如人之于人群,苹果之于苹果堆
- 体现了群体和个体的关系
类图示例
主角
的朋友们
成员是由配角聚合而成的一群人,他们和主角不要求有相同的生命周期
因为聚合也是一种特殊的关联关系,因此可以画成:
代码示例
package mainimport "fmt"// 定义主角类
type Protagonist struct {Name string//它的一个成员是配角的切片Friends []SupportingRole
}
//定义一个方法让配角加入主角的朋友(此处为了演示方便,和聚合关系无关)
func (p *Protagonist) AddFriend(supportingRoleList ...SupportingRole) {p.Friends = append(p.Friends, supportingRoleList...)
}
//定义一个方法查看主角(此处为了演示方便,和聚合关系无关)
func (p *Protagonist) Get() {fmt.Printf("%+v\n", p)
}
//定义配角类
type SupportingRole struct {Name string
}func main() {//实例化一个主角——刘备liuBei := &Protagonist{Name: "刘备",}//实例化两个配角——关羽、张飞guanYu := SupportingRole{Name: "关羽",}zhangFei := SupportingRole{Name: "张飞",}//将关羽、张飞加入刘备的朋友liuBei.AddFriend(guanYu, zhangFei)//查看刘备的信息liuBei.Get()
}
- 输出
&{Name:刘备 Friends:[{Name:关羽} {Name:张飞}]}
2.2 组合(Composition)
概念
- 是关联关系的一种,表示一种强的“拥有”关系。
- 如:人之于头、脚;汽车之于驾驶室、发动机
- 体现了严格的部分和整体的关系
- 部分和整体的生命周期一样
类图示例
人
的组成部分包括头
,它们的实例有相同的生命周期
因为他也是一种特殊的关联关系,因此可以画成
代码示例
package mainimport "fmt"
//定义一个类——人
type Person struct {Name string//他有一个成员是头Head Head
}
//定义一个类——头
type Head struct {weight float64
}
//写一个函数,用来实例化一个具体的人,这样保证了人和头的生命周期一致。(实际操作中可以写一个工厂)
func CreatePerson(name string, headWeight float64) (person *Person) {person = &Person{Name: name,Head: Head{weight: headWeight,},}return person
}func main() {//实例化一个人——颜良(八斤半的头留给关羽摘吧)yanLiang := CreatePerson("颜良", 8.5)fmt.Printf("%+v", yanLiang)
}
- 输出
&{Name:颜良 Head:{weight:8.5}}
3. 实现和泛化(代码的重用)
3.1 实现(Realization)
概念
- 体现为类对接口的实现
- 比如接口
人
有工作
方法,其泛化类男人
、女人
都可以实现该接口的工作
方法
- 比如接口
类图示例
如概念中所述,
男人
和女人
都实现了接口人
的工作
方法
因为是一种弱关系,因此我们可以看到是虚线链接
代码示例
package mainimport ("fmt"
)
//定义一个人的接口
type Person interface {Work()
}
//定义男人类是接口人的实现
type Man struct {Name string
}func (m *Man) Work() {fmt.Println("男人", m.Name, "开心的工作中")
}
//定义女人类是接口人的实现
type Woman struct {Name string
}func (w *Woman) Work() {fmt.Println("女人", w.Name, "开心的工作中")
}
//定义一个函数实例化具体的人(实际代码中我们可以写成一个工厂)
func CreatePerson(name string, sex string) Person {switch sex {case "man":return &Man{Name: name,}case "woman":return &Woman{Name: name,}default:return nil}
}func main() {CreatePerson("周瑜", "man").Work()CreatePerson("小乔", "woman").Work()}
- 输出
男人 周瑜 开心的工作中
女人 小乔 开心的工作中
3.2 泛化(Generalization)
概念
- 是继承的逆向关系,子类是父类的泛化。
- 男人和女人也可以抽象出人类,此时男人和女人是人类的泛化。
类图示例
男人
是人
的泛化,不但继承了人
的还拥有胡子
代码示例
package mainimport "fmt"
//定义一个类——人
type Person struct {Head stringBody string
}
//定义人的方法,用来设置人的属性
func (p *Person) SetPerson(head string, body string) {p.Head = headp.Body = body
}
//定义一个男人类,它是人的泛化(即它继承了人)
type Man struct {PersonBear string
}
//定义一个男人的方法,用来设置男人的属性
func (m *Man) SetMan(bear string) {m.Bear = bear
}func main() {//实例化一个男人——关羽guanYu := &Man{}//设置关羽人的属性guanYu.SetPerson("大头,红脸", "身高九尺")//设置关羽男人的属性guanYu.SetMan("长胡子")//查看结果fmt.Printf("%+v", guanYu)
}
- 结果输出
&{Person:{Head:大头,红脸 Body:身高九尺} Bear:长胡子}
相关文章:

类图的6种关系和golang应用
文章目录 1. 依赖和关联1.1 依赖(Dependency)概念类图示例代码示例 1.2 关联(Association)概念类图示例代码示例 2. 组合和聚合(特殊的关联关系)2.1 聚合(Aggregation)概念类图示例代…...
Linux tar 备忘清单
tar 备忘清单 语法选项创建一个 tar 格式的压缩文件创建压缩后的 tar.gz 存档文件生成压缩率更高的 tar.bz2 文件解压缩 tar 文件解压缩 tar.gz 文件解压缩 tar.bz2 文件列出归档内容从 tar 归档文件中提取单个文件从 tar 归档文件中提取多个文件使用通配符提取文件组添加文件或…...

76. 最小覆盖子串
题目链接:力扣 解题思路:滑动窗口 因为只需要最小子串中包含t中的所有字符即可,顺序不重要,所以可以先统计一下 t 中每个字符出现的次数,使用map进行统计: key表示t中的字符,value表示字符的个…...
科兴未来|2023“数智未来,聚放神采”医疗科技创新挑战赛
一、赛事亮点 聚焦前沿神经科学与脑科学领域 展示优质创新产品、技术、平台与服务 汇聚学术端、产业端、投资端多维专业视角 搭建合作交流、产业赋能与生态融合平台 共话行业发展方向与动态趋势 二、赛事简介 2023医疗科技创新挑战赛聚焦于神经科学及脑科学领域的前沿技…...

第56步 深度学习图像识别:CNN梯度权重类激活映射(TensorFlow)
基于WIN10的64位系统演示 一、写在前面 类激活映射(Class Activation Mapping,CAM)和梯度权重类激活映射(Gradient-weighted Class Activation Mapping,Grad-CAM)是两种可视化深度学习模型决策过程的技术…...

云道资本:2023中国氢能源产业-氢制备深度研究报告(附下载)
关于报告的所有内容,公众【营销人星球】获取下载查看 核心观点 中国可再生能源消纳能力提升远远滞后于发电占比的提升。大规模的可再生能源发电是实现碳中和的关键一步,但风电、光伏发电间歌性、波动性强,电网消纳压力较大,且电…...

java文件
一.File类 二.扫描指定目录,并找到名称中包含指定字符的所有普通文件(不包含目录),并且后续询问用户是否要删除该文件 我的代码: import java.io.File; import java.io.IOException; import java.util.Scanner;public class Tes…...
pyqt5 如何终止正在执行的线程?
在 PyQt5 中终止正在执行的线程,可以通过一些协调的方法来实现。一般情况下,直接强行终止线程是不安全的,可能会导致资源泄漏或者程序异常。相反,我们可以使用一种协作的方式,通知线程在合适的时候自行退出。 以下是一…...
力扣第357场周赛补题
6925. 故障键盘 - 力扣(LeetCode) 思路:模拟 class Solution { public:string finalString(string s) {string res;for(auto c : s){if(c i) reverse(res.begin(), res.end());else res c;}return res;} }; 6953. 判断是否能拆分数组 - 力…...
Keras指定model.fit()的输出
model.fit()当verbose1的时候会打印出所有指标和loss, 在多输出的情况下更是一团乱麻. 下面是一个可以指定每个epoch训练完的输入指标的方法: from keras.callbacks import Callback# Custom callback to display loss only at the end of each epoch class LossCallback(Call…...

替换开源LDAP,某科技企业用宁盾目录统一身份,为业务敏捷提供支撑
客户介绍 某高科技企业成立于2015年,是一家深耕于大物流领域的人工智能公司,迄今为止已为全球16个国家和地区,120余家客户打造智能化升级体验,场景覆盖海陆空铁、工厂等货运物流领域。 该公司使用开源LDAP面临的挑战 挑战1 开源…...
解决log4j.xml的url没有注册问题
在对log4j.xml配置文件配置时出现http//jakarta.apache.org/log4j/爆红,IDEA提示uri is not registered。源代码如下 <!DOCTYPE log4j:configuration SYSTEM "log4j.dtd"> <log4j:configuration xmlns:log4j"http://jakarta.apache.org/lo…...
深度思考操作系统面经
1 堆和栈的区别:(如果记的不太清楚,可以类比jvm中的堆和栈的区别,大差不差) 存储位置:堆是在计算机内存中动态分配的区域,而栈是在计算机内存中由操作系统自动分配和管理的区域。管理方式&…...

智慧工地源码:数字孪生智慧工地可视化解决方案
一、智慧工地建设背景 我国经济发展正从传统粗放式的高速增长阶段,进入高效率、低成本、可持续的中高速增长阶段。随着现代建筑的复杂度和体量等不断增加,施工现场管理的内容越来越多,管理的技术难度和要求在不断提高。传统的施工现场管理模…...
解决rockchip平台Android13系统以太网设置静态IP保存不了问题
前言 rk平台平Android13系统测试以太网,发现设置静态IP保存不了问题,即设置静态IP以后重启系统,IP又变成动态的了。 分析 抓取log发现保存静态IP的时候会打印如下log: 08-07 06:22:28.377 626 749 D EthernetNetworkFactory: updateInterface, iface: eth0, ipConfi…...
SQLAlchemy与标准SQL相比有哪些优点?
让我来给你讲讲SQLAlchemy和标准SQL相比有哪些优点吧! 首先,我们要知道,SQLAlchemy是一个Python的SQL工具包和对象关系映射(ORM)系统,它把Python的面向对象编程(OOP)的理念带入了数…...

Zookeeper与Kafka
Zookeeper与Kafka 一、Zookeeper 概述1.Zookeeper 定义2.Zookeeper 工作机制3.Zookeeper 特点4.Zookeeper 数据结构5.Zookeeper 应用场景6.Zookeeper 选举机制 二、部署 Zookeeper 集群1.准备 3 台服务器做 Zookeeper 集群2.安装 Zookeeper3.拷贝配置好的 Zookeeper 配置文件到…...

MySQL—— 基础语法大全
MySQL—— 基础 一、MySQL概述1.1 、数据库相关概念1.2 、MySQL 客户端连接1.3 、数据模型 二、SQL2.1、SQL通用语法2.2、SQL分类2.3、DDL2.4、DML2.5、DQL2.6、DCL 三、函数四、约束五、多表查询六、事务 一、MySQL概述 1.1 、数据库相关概念 数据库、数据库管理系统、SQL&a…...

css小练习:案例6.炫彩加载
一.效果浏览图 二.实现思路 html部分 HTML 写了一个加载动画效果,使用了一个包含多个 <span> 元素的 <div> 元素,并为每个 <span> 元素设置了一个自定义属性 --i。 这段代码创建了一个简单的动态加载动画,由20个垂直排列的…...
使用正则表达式替换文本中的html标签
文章目录 使用正则表达式替换文本中的html标签原文本:使用正则表达式进行替换替换后:展示 html 文本 使用正则表达式替换文本中的html标签 我们存储 markdown 文章时,如果存储转换后的 html 页面,那么在查出来的时候,…...

Docker 离线安装指南
参考文章 1、确认操作系统类型及内核版本 Docker依赖于Linux内核的一些特性,不同版本的Docker对内核版本有不同要求。例如,Docker 17.06及之后的版本通常需要Linux内核3.10及以上版本,Docker17.09及更高版本对应Linux内核4.9.x及更高版本。…...
Cursor实现用excel数据填充word模版的方法
cursor主页:https://www.cursor.com/ 任务目标:把excel格式的数据里的单元格,按照某一个固定模版填充到word中 文章目录 注意事项逐步生成程序1. 确定格式2. 调试程序 注意事项 直接给一个excel文件和最终呈现的word文件的示例,…...
<6>-MySQL表的增删查改
目录 一,create(创建表) 二,retrieve(查询表) 1,select列 2,where条件 三,update(更新表) 四,delete(删除表…...

以下是对华为 HarmonyOS NETX 5属性动画(ArkTS)文档的结构化整理,通过层级标题、表格和代码块提升可读性:
一、属性动画概述NETX 作用:实现组件通用属性的渐变过渡效果,提升用户体验。支持属性:width、height、backgroundColor、opacity、scale、rotate、translate等。注意事项: 布局类属性(如宽高)变化时&#…...

边缘计算医疗风险自查APP开发方案
核心目标:在便携设备(智能手表/家用检测仪)部署轻量化疾病预测模型,实现低延迟、隐私安全的实时健康风险评估。 一、技术架构设计 #mermaid-svg-iuNaeeLK2YoFKfao {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg…...
Qt Widget类解析与代码注释
#include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this); }Widget::~Widget() {delete ui; }//解释这串代码,写上注释 当然可以!这段代码是 Qt …...
CMake控制VS2022项目文件分组
我们可以通过 CMake 控制源文件的组织结构,使它们在 VS 解决方案资源管理器中以“组”(Filter)的形式进行分类展示。 🎯 目标 通过 CMake 脚本将 .cpp、.h 等源文件分组显示在 Visual Studio 2022 的解决方案资源管理器中。 ✅ 支持的方法汇总(共4种) 方法描述是否推荐…...

RNN避坑指南:从数学推导到LSTM/GRU工业级部署实战流程
本文较长,建议点赞收藏,以免遗失。更多AI大模型应用开发学习视频及资料,尽在聚客AI学院。 本文全面剖析RNN核心原理,深入讲解梯度消失/爆炸问题,并通过LSTM/GRU结构实现解决方案,提供时间序列预测和文本生成…...

视觉slam十四讲实践部分记录——ch2、ch3
ch2 一、使用g++编译.cpp为可执行文件并运行(P30) g++ helloSLAM.cpp ./a.out运行 二、使用cmake编译 mkdir build cd build cmake .. makeCMakeCache.txt 文件仍然指向旧的目录。这表明在源代码目录中可能还存在旧的 CMakeCache.txt 文件,或者在构建过程中仍然引用了旧的路…...

人工智能(大型语言模型 LLMs)对不同学科的影响以及由此产生的新学习方式
今天是关于AI如何在教学中增强学生的学习体验,我把重要信息标红了。人文学科的价值被低估了 ⬇️ 转型与必要性 人工智能正在深刻地改变教育,这并非炒作,而是已经发生的巨大变革。教育机构和教育者不能忽视它,试图简单地禁止学生使…...