# 【阅读】uml精粹 类图

本书的整体脉络如下：
![image.png](https://cdn.hashnode.com/res/hashnode/image/upload/v1660928063226/x06uUz3VW.png align="left")


class diagram 表示对象的类型以及其间存在的静态关系。用一个长方形表示类，用连线表示类之间的关系。

# 具体类图

## 长方形

对象的类型，也就是类有三部分表示而成

- 类名 (class name)
- 属性 (attribute)
- 操作 (operation)

属性 (attribute)

其中抽象来说，类的成员变量 可以有两种表示， 属性表示 和 关联表示。

属性表示：就是画在框里， 一般写 包括 可见行， 类型，名称 ，也可以写默认值 和 注释。 也可以标注是否是 static的 。

关联表示：连线的方式表示，类A 拥有若干个 类 C，若干 的术语是 重数，可以是 0-1，也可以是 1个，也可以多 * 表示多个

操作 (operation)

操作：画在框里，一般写 可见行，返回值，名称 和 参数, 也可以写注释

## 连线

类和类之间，有关联关系的可以用线连接起来。

比较宽泛可以直接连线，就表示有关系。

# 具体的关系

## 关联

一个类使用到了另外一个类，就是有关联关系。例如

```erlang
class A {
public B get()
}

class B {
public int calc(A a) 
}
```

- 用实线的情况，直接表示有关联
- 加普通箭头的情况，关联关系有方向，可以用箭头表示，一个使用了另外一方。

```java
@startuml
B --- A

@enduml
```

通过线和箭头的变化，又可以表示更具体的关系.

## 泛化

类之间具体还有实现接口的情况，成为泛化.  用虚线空心箭头表示

```erlang
class A implements B{
}
interface B {}
```

```java
@startuml

interface B
class A
A ..|> B

@enduml
```

## 实现

类之间还有继承的情况，成为实现。用实线空心箭头表示

```erlang
class A extend B {}
class B {}
```

```java
@startuml

interface B
class A
A --|> B

@enduml
```

## 组合

也就是属性关联表示的情况，用实线实心棱形箭头表示

```erlang
class A { 
private B b;
}
class B {}
```

关联表示法

```java

@startuml
class A
class B
A --* "1" B
@enduml
```

属性表示法

```java
@startuml
class A {
- B b
}
class B
@enduml
```

大概这些就够了。
