设计模式中的UML类图

在线绘图工具:

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版本中的变化_猎人在吃肉的博客-优快云博客icon-default.png?t=N176https://blog.youkuaiyun.com/xiaojin21cen/article/details/104346018不同语言的接口多多少少有些不同,但不变的是,接口内部的方法一定是抽象方法;如果没了这个特性,那接口就是一个纯纯的类了也失去了存在的必要。

包的概念也比较泛,不同语言有着不同的实现。我们姑且认为包(packet)是某个封装好的代码集合吧,这个集合对外提供了一些接口/函数供调用。

如cv2是一个包名,一般来说这个包也是一个.class文件: 

 

除了包之外,还有一些模块、组件、注释之类的东东,暂且不管他们吧..

好了,描述完节点后,自然会联想起图中节点间的关系(包括节点的自环也就是与自身的关系)。

搞软件工程理论的那帮人使用了以下名词描述边的关系:继承关系、关联关系、聚合关系、泛化关系、组合关系、实现关系、依赖关系、信赖关系、引用关系..

但他们之间是否能够单独作为一个划分?这是很难说清的事情。

说实话,我看了一些不同的博客,甚至去问了下chatgpt,发现存在一些不同的分类方式..这个领域这么久了应该有统一的分类标准吧,但为啥各种复制粘贴别人教科书的博客又各不相同呢?

模糊的定义将导致滥用和不统一,严格意义的划分或许又无法简单地描述边的复杂...难受

我认为关系的划分可以由以下几部分构成:1、实体之间属性的关系  2、实体间关联关系的强弱

3、实体间关系的权限..

先给出chatgpt的定义吧:


  1. 继承关系(Is-A Relationship):表示一个类是另一个类的子类,继承关系用带有空心箭头的实线表示,箭头指向父类。继承关系是一种类之间的关系,也称为Is-A关系,如“一个圆是一个形状”。

  2. 关联关系(Has-A Relationship):表示两个类之间存在关联,关联关系用实线表示,箭头指向被关联的类。关联关系是一种对象之间的关系,也称为Has-A关系,如“一个人有一张身份证”。

  3. 聚合关系(Aggregation):表示整体与部分之间的关系,聚合关系用带空心菱形的实线表示,菱形指向整体。聚合关系是一种对象之间的关系,也称为Part-Of关系,如“一个班级有多个学生”。

  4. 组合关系(Composition):表示整体与部分之间的强关系,组合关系用带实心菱形的实线表示,菱形指向整体。组合关系是一种对象之间的关系,也称为Has-A关系,如“一台电脑由多个硬件组成”。

  5. 依赖关系(Dependency):表示一个类的实现依赖于另一个类,依赖关系用带箭头的虚线表示,箭头指向被依赖的类。依赖关系是一种类之间的关系,如“一个汽车需要燃料”。

  6. 实现关系(Realization):表示一个类实现了一个接口或抽象类,实现关系用带有空心箭头的虚线表示,箭头指向接口或抽象类。实现关系是一种类之间的关系,如“一个人实现了教师接口”。


根据国内的一些文章(教材没在身边,下次更新),有些文章将边的关系划分为为以下三种:泛化关系、关联关系、依赖关系。

各种关系的强弱顺序:

泛化 > 关联 > 依赖

 继承 = 实现 > 组合 > 聚合 > 依赖

其中,泛化关系定义了 is a 的特性,关联关系定义了 has a 的特性,依赖关系定义了using a的特性。 

泛化关系

泛化关系表示一般与特殊的关系,如子类如何特性化父类的属性与行为,同类个体间相同属性类型、行为的不同特性。

继承关系

 

实现关系

实现关系是指接口及其实现类之间的关系

 

值得说明的是,java中支持接口对象作为类属性(成员变量)。

关联关系

关联关系是抽象模糊的定义

 

聚合关系

集体与个体的关系

 

组合关系

整体与部分的关系(强联系),整体与部分是不可分的,部分也不能给其它整体共享

 

依赖关系

一种弱关联关系。如果对象A用到对象B,但是和B的关系不是太明显的时候,就可以把这种关系看作是依赖关系。但我觉得这个关系还是挺强的,可能是定义者想强调被依赖对象的可替代性?但也存在很多不可替代的依赖对象诶

 

总结

没啥总结的,多用或许就熟悉了

有空写写设计模式的文章..

References

 UML详解(1):类的关系与如何绘制类图_类图怎么画_凯文叔叔的博客-优快云博客

30分钟学会UML类图 - 知乎 (zhihu.com)

Java 在线工具 | 菜鸟工具 (runoob.com)

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

七月是你的谎言..

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值