类图的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 页面,那么在查出来的时候,…...
【Python】 -- 趣味代码 - 小恐龙游戏
文章目录 文章目录 00 小恐龙游戏程序设计框架代码结构和功能游戏流程总结01 小恐龙游戏程序设计02 百度网盘地址00 小恐龙游戏程序设计框架 这段代码是一个基于 Pygame 的简易跑酷游戏的完整实现,玩家控制一个角色(龙)躲避障碍物(仙人掌和乌鸦)。以下是代码的详细介绍:…...
Prompt Tuning、P-Tuning、Prefix Tuning的区别
一、Prompt Tuning、P-Tuning、Prefix Tuning的区别 1. Prompt Tuning(提示调优) 核心思想:固定预训练模型参数,仅学习额外的连续提示向量(通常是嵌入层的一部分)。实现方式:在输入文本前添加可训练的连续向量(软提示),模型只更新这些提示参数。优势:参数量少(仅提…...
在鸿蒙HarmonyOS 5中实现抖音风格的点赞功能
下面我将详细介绍如何使用HarmonyOS SDK在HarmonyOS 5中实现类似抖音的点赞功能,包括动画效果、数据同步和交互优化。 1. 基础点赞功能实现 1.1 创建数据模型 // VideoModel.ets export class VideoModel {id: string "";title: string ""…...
【位运算】消失的两个数字(hard)
消失的两个数字(hard) 题⽬描述:解法(位运算):Java 算法代码:更简便代码 题⽬链接:⾯试题 17.19. 消失的两个数字 题⽬描述: 给定⼀个数组,包含从 1 到 N 所有…...
渲染学进阶内容——模型
最近在写模组的时候发现渲染器里面离不开模型的定义,在渲染的第二篇文章中简单的讲解了一下关于模型部分的内容,其实不管是方块还是方块实体,都离不开模型的内容 🧱 一、CubeListBuilder 功能解析 CubeListBuilder 是 Minecraft Java 版模型系统的核心构建器,用于动态创…...
现有的 Redis 分布式锁库(如 Redisson)提供了哪些便利?
现有的 Redis 分布式锁库(如 Redisson)相比于开发者自己基于 Redis 命令(如 SETNX, EXPIRE, DEL)手动实现分布式锁,提供了巨大的便利性和健壮性。主要体现在以下几个方面: 原子性保证 (Atomicity)ÿ…...
【JVM面试篇】高频八股汇总——类加载和类加载器
目录 1. 讲一下类加载过程? 2. Java创建对象的过程? 3. 对象的生命周期? 4. 类加载器有哪些? 5. 双亲委派模型的作用(好处)? 6. 讲一下类的加载和双亲委派原则? 7. 双亲委派模…...
站群服务器的应用场景都有哪些?
站群服务器主要是为了多个网站的托管和管理所设计的,可以通过集中管理和高效资源的分配,来支持多个独立的网站同时运行,让每一个网站都可以分配到独立的IP地址,避免出现IP关联的风险,用户还可以通过控制面板进行管理功…...
安卓基础(Java 和 Gradle 版本)
1. 设置项目的 JDK 版本 方法1:通过 Project Structure File → Project Structure... (或按 CtrlAltShiftS) 左侧选择 SDK Location 在 Gradle Settings 部分,设置 Gradle JDK 方法2:通过 Settings File → Settings... (或 CtrlAltS)…...
uniapp 集成腾讯云 IM 富媒体消息(地理位置/文件)
UniApp 集成腾讯云 IM 富媒体消息全攻略(地理位置/文件) 一、功能实现原理 腾讯云 IM 通过 消息扩展机制 支持富媒体类型,核心实现方式: 标准消息类型:直接使用 SDK 内置类型(文件、图片等)自…...
