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

设计模式前置了解uml图

在开发前,会进行系统的设计,而数据模型的设计大多通过 UML 类图实现。为了在 UML 类图中清晰地表达类之间的关系,需要对类之间的关系有一定的认识,并且了解相关的表达符号。

类之间的关系有以下几种:

组合
聚合
关联
泛化
依赖

组合
什么是组合?
表示类之间整体和部分的关系,但是组合关系中部分和整体具有统一的生存期。一旦整体对象不存在,部分对象也将不存在。

举例
比如人和人的大脑,人是整体,大脑是部分,二者具有统一的生存期,整体不存在,部分也将不存在。

UML类图中符号如何表示
先忽略图中数字含义,实体菱形与整体端相连,箭头与部分连接。

在这里插入图片描述

聚合
什么是聚合?
聚合表示整体与部分的关系,并非同生共死,部分实例可以添加到聚合整体,也可以从聚合整体中移出。此时整体与部分之间是可分离的,它们可以具有各自的生命周期,部分可以属于多个整体对象,也可以为多个整体对象共享。

相较于组合,聚合中整体与部分的关系更弱,更接近于"has a"。

举例
比如计算机与CPU、公司与员工的关系等,比如一个航母编队包括海空母舰、驱护舰艇、舰载飞机及核动力攻击潜艇等。

UML类图中符号如何表示
在UML类图设计中,聚合关系以空心菱形加实线箭头表示。 空心菱形与整体连接,箭头与部分连接。
在这里插入图片描述
关联
什么是关联?
是类之间的一种很弱的联系。关联可以有方向,可以是单向关联,也可以是双向关联。

分为单向关联(只是班级中增加了学生)、双向关联(在学生中也添加班级属性)
分为一对一(学生和学生证)、一对多(班级和学生)、多对多关联(学生和课程)
有两个类的关联(客户和订单、订单和商品)、还有一个类和自身关联(领导也是员工)

public class Teacher{//老师不会只有一个学生,得有多个。private Lsit<Student> student;
}
public class Student{//学生不会只有一个老师,得有多个。private Lsit<Teacher> teacher;//学生不会只有一门课程,得有多个。private Lsit<Course> course;
}
public class Course{}

UML类图中符号如何表示
【箭头及指向】: 带普通箭头的实心线,指向被拥有者
在这里插入图片描述

泛化
什么是泛化?
泛化定义了一般元素和特殊元素之间的分类关系,类之间的这种泛化关系也就是继承关系。泛化关系是“a-kind-of”关系,定义一般元素和特殊元素之间的分类关系。

例如:老虎是动物的一种, 即有老虎的特性也有动物的共性。

public class Animal{}
public class Tiger extends Animal{//继承Animal类
}

UML类图中符号如何表示
【箭头指向】:带三角箭头的实线,箭头指向父类

在这里插入图片描述
类似泛化的实现:
在这里插入图片描述
依赖
什么是依赖?
表现为函数中的参数(use a),是类与类之间的连接,表示一个类依赖于另一个类的定义,其中一个类的变化将影响另外一个类。例如如果 A 依赖于 B,则 B 体现为局部变量,方法的参数、或静态方法的调用。常见的依赖关系如下:
(1)类B以参数的形式传入类A的方法。我个人将它就取名为“参数依赖”。
(2)类B以局部变量的形式存在于类A的方法中。我个人将它就取名为“局部依赖”。
(3)类A调用类B的静态属性或方法。我个人将它就取名为“静态依赖”。

局部变量(Local Variable),是 Java 编程语言中位于代码块内的一种变量。如同对象将其状态存储在字段中那样,代码块将其临时状态存储在局部变量中。局部变量始终被归类为“变量”(而不是“字段”)。
提示:类中的方法体、构造方法体和语句中的块,都是用一对大括号 {} 括起来的零个或多个语句组,故在本文中统称为“代码块”。

UML类图中符号如何表示
UML图中实现使用一条带有箭头的虚线指向被依赖的类,如下:

在这里插入图片描述
下面这张UML图,比较形象地展示了各种类图关系:
在这里插入图片描述

相关文章:

  • 小波散射网络及其应用
  • Sklearn交叉验证
  • 捍卫数据保护:预防和缓解.mallox勒索病毒的威胁
  • Lwip之TCP服务端示例记录(1对1)
  • RHEL9 DNF/YUM仓库管理软件包
  • 【More Effective C++】条款24:了解虚函数的成本
  • day16_购物车(添加购物车,购物车列表查询,删除购物车商品,更新选中商品状态,完成购物车商品的全选,清空购物车)
  • springboot单体项目链路日志跟踪及接口耗时
  • Sklearn线性回归
  • WebSocket:实现客户端与服务器实时通信的技术
  • 考研复习C语言初阶(4)+标记和BFS展开的扫雷游戏
  • 嵌入式学习37-TCP并发模型
  • 铅酸充电器开关电源设计
  • k8s-生产级的k8s高可用(2) 25
  • 目标检测数据集:手机顶盖焊缺陷检测数据集
  • JavaScript-如何实现克隆(clone)函数
  • Android 控件背景颜色处理
  • codis proxy处理流程
  • es6(二):字符串的扩展
  • iOS 系统授权开发
  • java取消线程实例
  • Mybatis初体验
  • Python3爬取英雄联盟英雄皮肤大图
  • rc-form之最单纯情况
  • ReactNative开发常用的三方模块
  • session共享问题解决方案
  • 从 Android Sample ApiDemos 中学习 android.animation API 的用法
  • 分享一个自己写的基于canvas的原生js图片爆炸插件
  • 前端路由实现-history
  • 浅谈web中前端模板引擎的使用
  • 用Visual Studio开发以太坊智能合约
  • 深度学习之轻量级神经网络在TWS蓝牙音频处理器上的部署
  • 宾利慕尚创始人典藏版国内首秀,2025年前实现全系车型电动化 | 2019上海车展 ...
  • ​Linux·i2c驱动架构​
  • ​VRRP 虚拟路由冗余协议(华为)
  • ## 临床数据 两两比较 加显著性boxplot加显著性
  • #100天计划# 2013年9月29日
  • (C++)栈的链式存储结构(出栈、入栈、判空、遍历、销毁)(数据结构与算法)
  • (Redis使用系列) SpirngBoot中关于Redis的值的各种方式的存储与取出 三
  • (论文阅读32/100)Flowing convnets for human pose estimation in videos
  • (十六)Flask之蓝图
  • (一)基于IDEA的JAVA基础10
  • (正则)提取页面里的img标签
  • (转)【Hibernate总结系列】使用举例
  • (转)我也是一只IT小小鸟
  • ***php进行支付宝开发中return_url和notify_url的区别分析
  • .NET Compact Framework 多线程环境下的UI异步刷新
  • .NET core 自定义过滤器 Filter 实现webapi RestFul 统一接口数据返回格式
  • .NET Standard、.NET Framework 、.NET Core三者的关系与区别?
  • .NET3.5下用Lambda简化跨线程访问窗体控件,避免繁复的delegate,Invoke(转)
  • .netcore 如何获取系统中所有session_ASP.NET Core如何解决分布式Session一致性问题
  • .net对接阿里云CSB服务
  • .NET企业级应用架构设计系列之开场白
  • .pub是什么文件_Rust 模块和文件 - 「译」
  • @JsonSerialize注解的使用