在线绘图工具:
https://app.diagrams.net/
https://www.processon.com/
第一个需要挂梯子,但很好用,本文用它绘制样例图
最近在看Head First一书,即使在软件工程的课程中学习过UML类图如何绘制,但显然已经忘掉很多了..希望通过这篇博客拾起来吧
在下文中,将类图抽象为“节点”与“边”,从图论的角度将类图的概念抽象成这两种方式进行描述;其中,节点为具体类、抽象类、接口和包等实体的介绍,边即为他们之间关系的介绍,主要是泛化、关联与依赖关系。
目录
节点
类
接口
包
边
泛化关系
继承关系
实现关系
关联关系
聚合关系
组合关系
依赖关系
总结
References
节点
类
类是封装对象的一种结构,也是人们认识世界的一种抽象方法..
一般来说,类由两部分组成:1、标识类自身特性的属性集合 2、定义在属性集合上的操作/方法
常见的UML类图有以下两种:
其中,类图 (左) 从上至下分为三部分;第一部分为类名,第二部分是类的自身属性,每个属性开始的+ - #表示属性的公共、私有或保护权限,type为属性的类型,如 int 、string等,第三部分为类的方法,+ - #仍然代表方法权限,当然还有以static为标识的静态方法。 此外,default表示待定。
右边的类图就是一种简单版了,可在还不知道类的操作的情况下对对象进行抽象。
接口
接口的概念像所谓的组件、元素一样,都比较泛。
我对接口的概述:
接口是一类方法的集合。方法的实现、实现的对象与调用的对象都是default的, 接口它自己并不care这三者。
一个典型的接口如下所示:
其中,从上至下分为三部分,第一部分是以<< Interface>>作为接口的标识,在这之下是接口的名词;第二部分与第三部分跟类图类似,但不同的是接口中只提供抽象方法,此外,大多数接口中的属性都是一些常量。
值得说明的是,java在不同版本中逐渐增加了对接口内部属性与方法的权限支持,具体可参考:
java 接口(interface)在不同JDK版本中的变化_猎人在吃肉的博客-CSDN博客https://blog.csdn.net/xiaojin21cen/article/details/104346018不同语言的接口多多少少有些不同,但不变的是,接口内部的方法一定是抽象方法;如果没了这个特性,那接口就是一个纯纯的类了也失去了存在的必要。
包
包的概念也比较泛,不同语言有着不同的实现。我们姑且认为包(packet)是某个封装好的代码集合吧,这个集合对外提供了一些接口/函数供调用。
如cv2是一个包名,一般来说这个包也是一个.class文件:
除了包之外,还有一些模块、组件、注释之类的东东,暂且不管他们吧..
边
好了,描述完节点后,自然会联想起图中节点间的关系(包括节点的自环也就是与自身的关系)。
搞软件工程理论的那帮人使用了以下名词描述边的关系:继承关系、关联关系、聚合关系、泛化关系、组合关系、实现关系、依赖关系、信赖关系、引用关系..
但他们之间是否能够单独作为一个划分?这是很难说清的事情。
说实话,我看了一些不同的博客,甚至去问了下chatgpt,发现存在一些不同的分类方式..这个领域这么久了应该有统一的分类标准吧,但为啥各种复制粘贴别人教科书的博客又各不相同呢?
模糊的定义将导致滥用和不统一,严格意义的划分或许又无法简单地描述边的复杂...难受
我认为关系的划分可以由以下几部分构成:1、实体之间属性的关系 2、实体间关联关系的强弱
3、实体间关系的权限..
先给出chatgpt的定义吧:
-
继承关系(Is-A Relationship):表示一个类是另一个类的子类,继承关系用带有空心箭头的实线表示,箭头指向父类。继承关系是一种类之间的关系,也称为Is-A关系,如“一个圆是一个形状”。
-
关联关系(Has-A Relationship):表示两个类之间存在关联,关联关系用实线表示,箭头指向被关联的类。关联关系是一种对象之间的关系,也称为Has-A关系,如“一个人有一张身份证”。
-
聚合关系(Aggregation):表示整体与部分之间的关系,聚合关系用带空心菱形的实线表示,菱形指向整体。聚合关系是一种对象之间的关系,也称为Part-Of关系,如“一个班级有多个学生”。
-
组合关系(Composition):表示整体与部分之间的强关系,组合关系用带实心菱形的实线表示,菱形指向整体。组合关系是一种对象之间的关系,也称为Has-A关系,如“一台电脑由多个硬件组成”。
-
依赖关系(Dependency):表示一个类的实现依赖于另一个类,依赖关系用带箭头的虚线表示,箭头指向被依赖的类。依赖关系是一种类之间的关系,如“一个汽车需要燃料”。
-
实现关系(Realization):表示一个类实现了一个接口或抽象类,实现关系用带有空心箭头的虚线表示,箭头指向接口或抽象类。实现关系是一种类之间的关系,如“一个人实现了教师接口”。
根据国内的一些文章(教材没在身边,下次更新),有些文章将边的关系划分为为以下三种:泛化关系、关联关系、依赖关系。
各种关系的强弱顺序:
泛化 > 关联 > 依赖
继承 = 实现 > 组合 > 聚合 > 依赖
其中,泛化关系定义了 is a 的特性,关联关系定义了 has a 的特性,依赖关系定义了using a的特性。
泛化关系
泛化关系表示一般与特殊的关系,如子类如何特性化父类的属性与行为,同类个体间相同属性类型、行为的不同特性。
继承关系
实现关系
实现关系是指接口及其实现类之间的关系
值得说明的是,java中支持接口对象作为类属性(成员变量)。
关联关系
关联关系是抽象模糊的定义
聚合关系
集体与个体的关系
组合关系
整体与部分的关系(强联系),整体与部分是不可分的,部分也不能给其它整体共享
依赖关系
一种弱关联关系。如果对象A用到对象B,但是和B的关系不是太明显的时候,就可以把这种关系看作是依赖关系。但我觉得这个关系还是挺强的,可能是定义者想强调被依赖对象的可替代性?但也存在很多不可替代的依赖对象诶
总结
没啥总结的,多用或许就熟悉了
有空写写设计模式的文章..
References
UML详解(1):类的关系与如何绘制类图_类图怎么画_凯文叔叔的博客-CSDN博客
30分钟学会UML类图 - 知乎 (zhihu.com)
Java 在线工具 | 菜鸟工具 (runoob.com)