当前位置: 首页 > news >正文

类图的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)

概念

  • 体现为局部变量、方法的形参,或者对静态方法的调用。
    • 如:出行使用汽车,下雨打伞等
    • 是一种弱关联关系,也是一种临时关系

类图示例

Person
+Travel(car Car)
Car

代码示例

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中可以表现为结构体的成员
    • 如:我的朋友(聚合),人和身体部位(组合),汽车和轮子(组合)
    • 是一种强关联关系,也是一种长期关系

类图示例

Person
+Head:Head
+Hand:String
Head

代码示例

参考下文 聚合、组合

2. 组合和聚合(特殊的关联关系)

2.1 聚合(Aggregation)

概念

  • 是关联关系的一种,表示一种弱的“拥有”关系。
    • 如人之于人群,苹果之于苹果堆
    • 体现了群体和个体的关系

类图示例

主角朋友们成员是由配角聚合而成的一群人,他们和主角不要求有相同的生命周期

Protagonist
+Name:string
+Friends:List
SupportingRole

因为聚合也是一种特殊的关联关系,因此可以画成:

Protagonist
+Name:string
+Friends:List
SupportingRole

代码示例

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)

概念

  • 是关联关系的一种,表示一种强的“拥有”关系。
    • 如:人之于头、脚;汽车之于驾驶室、发动机
    • 体现了严格的部分和整体的关系
    • 部分和整体的生命周期一样

类图示例

的组成部分包括,它们的实例有相同的生命周期

Person
+Head:Head
+Hand:String
Head

因为他也是一种特殊的关联关系,因此可以画成

Person
+Head:Head
+Hand:String
Head

代码示例

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)

概念

  • 体现为类对接口的实现
    • 比如接口工作方法,其泛化类男人女人都可以实现该接口的工作方法

类图示例

如概念中所述,男人女人都实现了接口工作方法

«interface»
Person
+Work()
Man
+Work()
Woman
+Work()

因为是一种弱关系,因此我们可以看到是虚线链接

代码示例

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)

概念

  • 是继承的逆向关系,子类是父类的泛化。
    • 男人和女人也可以抽象出人类,此时男人和女人是人类的泛化。

类图示例

男人的泛化,不但继承了的还拥有胡子

Person
+Name:String
+Head:String
Man
+Person:Person
+Beard:String

代码示例

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/爆红&#xff0c;IDEA提示uri is not registered。源代码如下 <!DOCTYPE log4j:configuration SYSTEM "log4j.dtd"> <log4j:configuration xmlns:log4j"http://jakarta.apache.org/lo…...

深度思考操作系统面经

1 堆和栈的区别&#xff1a;&#xff08;如果记的不太清楚&#xff0c;可以类比jvm中的堆和栈的区别&#xff0c;大差不差&#xff09; 存储位置&#xff1a;堆是在计算机内存中动态分配的区域&#xff0c;而栈是在计算机内存中由操作系统自动分配和管理的区域。管理方式&…...

智慧工地源码:数字孪生智慧工地可视化解决方案

一、智慧工地建设背景 我国经济发展正从传统粗放式的高速增长阶段&#xff0c;进入高效率、低成本、可持续的中高速增长阶段。随着现代建筑的复杂度和体量等不断增加&#xff0c;施工现场管理的内容越来越多&#xff0c;管理的技术难度和要求在不断提高。传统的施工现场管理模…...

解决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相比有哪些优点吧&#xff01; 首先&#xff0c;我们要知道&#xff0c;SQLAlchemy是一个Python的SQL工具包和对象关系映射&#xff08;ORM&#xff09;系统&#xff0c;它把Python的面向对象编程&#xff08;OOP&#xff09;的理念带入了数…...

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 写了一个加载动画效果&#xff0c;使用了一个包含多个 <span> 元素的 <div> 元素&#xff0c;并为每个 <span> 元素设置了一个自定义属性 --i。 这段代码创建了一个简单的动态加载动画&#xff0c;由20个垂直排列的…...

使用正则表达式替换文本中的html标签

文章目录 使用正则表达式替换文本中的html标签原文本&#xff1a;使用正则表达式进行替换替换后&#xff1a;展示 html 文本 使用正则表达式替换文本中的html标签 我们存储 markdown 文章时&#xff0c;如果存储转换后的 html 页面&#xff0c;那么在查出来的时候&#xff0c;…...

CentOS下的分布式内存计算Spark环境部署

一、Spark 核心架构与应用场景 1.1 分布式计算引擎的核心优势 Spark 是基于内存的分布式计算框架&#xff0c;相比 MapReduce 具有以下核心优势&#xff1a; 内存计算&#xff1a;数据可常驻内存&#xff0c;迭代计算性能提升 10-100 倍&#xff08;文档段落&#xff1a;3-79…...

条件运算符

C中的三目运算符&#xff08;也称条件运算符&#xff0c;英文&#xff1a;ternary operator&#xff09;是一种简洁的条件选择语句&#xff0c;语法如下&#xff1a; 条件表达式 ? 表达式1 : 表达式2• 如果“条件表达式”为true&#xff0c;则整个表达式的结果为“表达式1”…...

《通信之道——从微积分到 5G》读书总结

第1章 绪 论 1.1 这是一本什么样的书 通信技术&#xff0c;说到底就是数学。 那些最基础、最本质的部分。 1.2 什么是通信 通信 发送方 接收方 承载信息的信号 解调出其中承载的信息 信息在发送方那里被加工成信号&#xff08;调制&#xff09; 把信息从信号中抽取出来&am…...

第25节 Node.js 断言测试

Node.js的assert模块主要用于编写程序的单元测试时使用&#xff0c;通过断言可以提早发现和排查出错误。 稳定性: 5 - 锁定 这个模块可用于应用的单元测试&#xff0c;通过 require(assert) 可以使用这个模块。 assert.fail(actual, expected, message, operator) 使用参数…...

ServerTrust 并非唯一

NSURLAuthenticationMethodServerTrust 只是 authenticationMethod 的冰山一角 要理解 NSURLAuthenticationMethodServerTrust, 首先要明白它只是 authenticationMethod 的选项之一, 并非唯一 1 先厘清概念 点说明authenticationMethodURLAuthenticationChallenge.protectionS…...

Java 加密常用的各种算法及其选择

在数字化时代&#xff0c;数据安全至关重要&#xff0c;Java 作为广泛应用的编程语言&#xff0c;提供了丰富的加密算法来保障数据的保密性、完整性和真实性。了解这些常用加密算法及其适用场景&#xff0c;有助于开发者在不同的业务需求中做出正确的选择。​ 一、对称加密算法…...

【论文阅读28】-CNN-BiLSTM-Attention-(2024)

本文把滑坡位移序列拆开、筛优质因子&#xff0c;再用 CNN-BiLSTM-Attention 来动态预测每个子序列&#xff0c;最后重构出总位移&#xff0c;预测效果超越传统模型。 文章目录 1 引言2 方法2.1 位移时间序列加性模型2.2 变分模态分解 (VMD) 具体步骤2.3.1 样本熵&#xff08;S…...

selenium学习实战【Python爬虫】

selenium学习实战【Python爬虫】 文章目录 selenium学习实战【Python爬虫】一、声明二、学习目标三、安装依赖3.1 安装selenium库3.2 安装浏览器驱动3.2.1 查看Edge版本3.2.2 驱动安装 四、代码讲解4.1 配置浏览器4.2 加载更多4.3 寻找内容4.4 完整代码 五、报告文件爬取5.1 提…...

Java多线程实现之Thread类深度解析

Java多线程实现之Thread类深度解析 一、多线程基础概念1.1 什么是线程1.2 多线程的优势1.3 Java多线程模型 二、Thread类的基本结构与构造函数2.1 Thread类的继承关系2.2 构造函数 三、创建和启动线程3.1 继承Thread类创建线程3.2 实现Runnable接口创建线程 四、Thread类的核心…...

今日学习:Spring线程池|并发修改异常|链路丢失|登录续期|VIP过期策略|数值类缓存

文章目录 优雅版线程池ThreadPoolTaskExecutor和ThreadPoolTaskExecutor的装饰器并发修改异常并发修改异常简介实现机制设计原因及意义 使用线程池造成的链路丢失问题线程池导致的链路丢失问题发生原因 常见解决方法更好的解决方法设计精妙之处 登录续期登录续期常见实现方式特…...