UML类图
UML类图浅探
其实UML类图在软件工程专业的学习中很常见,最近被面向对象设计的作业逼得没办法,设计模式很多的课件都是直接上UML类图,所以来自己浅学一波,顺便水一波博客(bushi),下面我们就开始(^▽^)~
假如说,现在我们有一个学生类:
1 | class Student { |
那么这个类用UML类图就可以表示为:
类的标题
表示方法 | 意义 |
---|---|
类名 | 普通类 |
<<类名>> | 接口类 |
前面的符号
对于成员变量和方法的可访问性表示:
符号 | 代码 | 可访问性 |
---|---|---|
+ | public | 公开的 |
- | private | 私有的 |
# | protected | 仅子类和自己可访问的 |
~ | package | 包内可访问的 |
成员变量的表示
<可访问性符号> <变量名> : <变量类型>
eg:
+ names : String[]
- height : int
~ bander : bool
# address : String
方法的表示
<可访问性符号> <方法名(<变量名> :<变量类型>, …)> :<返回类型>
eg:
+ eat(food : Food, water : Drink) : void
- sleep(time : int) : void
类间关系
依赖关系
依赖关系UML表示
使用虚线线条型箭头
依赖关系的表现形式
- B类的实例作为A类方法的参数
- B类的实例作为A类方法的局部变量
- A类调用B类的静态方法
以上例子即为Food的实例作为Student中eat方法的参数
关联关系
在Java中实现关联关系时,通常将一个类的对象作为另一个类的成员变量。
在UML类图中,用实线连接有关联关系的类,并可在关联线上标注角色名或关系名。
单向关联
使用单向箭头,并在箭头上写明关系
双向关联
使用双向箭头
或者使用无头线段直接连接
关联关系
类似E-R图中
表示方式 | 多重性说明 |
---|---|
1..1 | 另一个类的一个对象只与该类的一个对象有关系 |
0..* | 另一个类的一个对象只与该类的零个或多个对象有关系 |
1..* | 另一个类的一个对象与该类的一个或多个对象有关系 |
0..1 | 另一个类的一个对象与该类的对象没关系或者只与该类的一个对象有关系 |
m..n | 另一个类的一个对象与该类最少m,最多n个对象有关系 |
聚合关系
是整体与部分的关系,且部分可以离开整体而单独存在。如车和轮胎是整体和部分的关系,轮胎离开车仍然可以存在。
聚合关系是关联关系的一种,是强的关联关系;关联和聚合在语法上无法区分,必须考察具体的逻辑关系。
聚合关系使用起点:小菱形,终点:线条型箭头表示
该例子中,单独的成绩离开对应的学生后就毫无意义(阿巴阿巴(/ω\)似乎也不一定对,你理解意思就行)
组合关系
组合(Composition)关系也表示类之间整体和部分的关系,但是在组合关系中整体对象控制成员对象的生命周期,一旦整体对象不存在了,成员对象也即随之消亡。
从代码实现上看,一般在整体类的构造方法中直接实例化成员类,并且除整体类对象外,其它类的对象无法获取该对象的引用。
组合关系使用起点:黑色菱形,终点:线条型箭头表示
该例子中,Leg的两个实例在Student的legs成员变量中,随着Student的销毁而被销毁
泛化关系 / 继承关系
是一种继承关系,表示一般与特殊的关系,它指定了子类如何特化父类的所有特征和行为。
在Java中,我们使用面向对象的三大特性之一——继承来实现泛化关系,具体来说会用到extends
关键字。
在UML类图中,泛化关系用带空心三角形(指向父类)的实线表示。并且子类中不需要标明其从父类继承下来的属性和方法,只须注明其新增的属性和方法即可。
实现关系
在UML类图中,类与接口间的实现关系用带空心三角形的虚线表示。同时类中也需要列出接口中所声明的所有方法(这一点与类间的继承关系表示不同)。
java中表现为implements
。
想不出来了直接用网图了
关系强弱排序
泛化 = 实现 > 组合 > 聚合 > 关联 > 依赖
参考资料: