类之间的关系
注释 |
符号 |
图释 |
箭头指向 |
关系 |
代码体现 |
Extension Generalization (泛化也就是继承) |
<l- |
|
带三角箭头的实线,箭头指向父类 |
是一种继承关系,它指定了子类如何特化父类的所有特征和行为 |
|
Composition(聚合) |
o-- |
|
带空心菱形的实心线,菱形指向整体 |
是整体与部分的关系 |
成员变量 |
Aggregation(组合) |
*-- |
|
带实心菱形的实线,菱形指向整体 |
是整体与部分的关系 |
成员变量 |
Realization(实现) |
..l> |
|
带三角箭头的虚线,箭头指向接口 |
是一种类与接口的关系,表示类是接口所有特征和行为的实现 |
|
Association(关联) |
--> |
|
带普通箭头的实心线,指向被拥有者 |
是一种拥有的关系,它使一个类知道另一个类的属性和方法 |
成员变量 |
Dependency(依赖) |
..> |
|
带箭头的虚线,指向被使用者 |
是一种使用的关系,所以要尽量不使用双向的互相依赖 |
局部变量、方法的参数或者对静态方法的调用 |
各种关系的强弱顺序
- 泛化(继承) = 实现 > 组合 > 聚合 > 关联 > 依赖
关系上的标识
添加方法
定义可访问性
符号 |
字段图标 |
方法图标 |
权限 |
- |
|
|
private |
# |
|
|
protected |
~ |
|
|
package private |
+ |
|
|
public |
- 通常情况这样是不容易被理解的
- 我们可以设置不显示图片,以
-
、#
、~
、+
来表是,加上这句话skinparam classAttributeIconSize 0
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| skinparam classAttributeIconSize 0 class Car { - String driver + String oil + String say() # String do() ~ String eat() - String lov() } class bmw implements Car{ + private drive() }
|
高级类体
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| abstract class CarFactory{ .. 此处是属性 .. {static} String hello :静态属性 下划线 -- 此处是方法 -- - String say() ==此处是抽象方法== {abstract} void methods() :抽象方法 斜体 } abstract class CarFactory2{ {static} String hello :静态属性 下划线 - String say() {abstract} void methods() :抽象方法 斜体 } abstract class CarFactory3{ {static} String hello :静态属性 下划线 - String say() {abstract} void methods() :抽象方法 斜体 }
|
- 代码可以看出来,如果属性不仅跟着类下方写的话,访问权限的图标就会由图片变成
-
。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
| abstract class CarFactory<<Car>>{ {abstract} Car build() } note left: 我不知道该说啥 class CarBuilder note right : 我是一个车 class CarBuilder<<Car>> { } class Cars{ String word() } note top : "hello </br>" annotation superwarnings enum Time{ DAYS HOURS } /'设置note的颜色'/ note top of CarBuilder #pink In java, <size:18>every</size> <u>class</u> <b>extends</b> <i>this</i> one. end note
|
使用泛型
1 2 3 4
| class Foo<? extends Element> { int size() } Foo *- Element
|
包
1 2 3 4 5 6 7 8 9
| package "Classic Collections" #DDDDDD { Object <|-- ArrayList } package net.sourceforge.plantuml { Object <|-- Demo1 Demo1 *- Demo2 }
|
包的样式
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| scale 750 width package foo1 <<Node>> { class Class1 } package foo2 <<Rect>> { class Class2 } package foo3 <<Folder>> { class Class3 } package foo4 <<Frame>> { class Class4 } package foo5 <<Cloud>> { class Class5 } package foo6 <<Database>> { class Class6 }
|
类之间的关系
1 2 3 4 5 6 7 8 9 10
| class Student { Name } Student "0..*" - "1..*" Course (Student, Course) .. Enrollment class Enrollment { drop() cancel() }
|
1 2 3 4 5 6 7 8 9 10
| class Student { Name } Student "0..*" -- "1..*" Course //决定因素 就在于 是一个-还是-- (Student, Course) . Enrollment class Enrollment { drop() cancel() }
|