类图(ClassDiagrams)是系统中类及类间关系的静态描述视图。由多个类及这些类间的关系组成。功能有两种:
- 显示系统内部信息结构,描述信息行为
- 为其他图(顺序图、交互图)定义基础
在系统设计阶段,类图直接引导OOP语言实现类。通俗来说就是按照类图来写类,或者换个说法就是类及类间关系设计工作在类图设计阶段就完成。编码实现时只用照着类图来就行。
btw举例中会用PlantUML再实现一次,非常简单。借助plantUML可以大幅度缩减绘图时间
类
类封装了数据和行为,是面向对象的重要组成部分,它是具有相同属性、操作、关系的对应集合的总称。在设计类的时候,将类的职责分解为类的属性和操作。类的属性即类的数据职责,类的操作即类的行为职责。
类属性及表示方式
在UML类图中,类使用带有分割线的矩形来表示,其中包含类名,属性(field)、和方法(metod)。比如下边的Employee类:
对应plaintext为:
class Employee {-name-age+modifyinfo()}
类成员前的符号表示成员属性,+表public,-表peivate,#表protected/friend。所以Employee就有三个私有属性和一个公有方法。
属性的完整表示方式:可见性 名称 :类型 [ = 缺省值]中括号中的内容表示是可选的。
方法的完整表示方式:可见性 名称(参数列表) [ : 返回类型]中括号中的内容是可选的。
类的方法和表示方式
下图的Demo类中有三个方法:
对应的plaintext为:
@startumlclass Demo{+ method(Object par) :void# method2() :String- mothod3(int par1,int par2[]) : int}@enduml
- public方法method1接收一个类型为Object的参数,返回值类型为void
- protected方法method2无参数,返回值类型为String
- private方法method3接收类型分别为int、int[]的参数,返回值类型为int
类间关系的表示方式
关联关系
关联关系又可进一步分为单向关联、双向关联和自关联单向关联
我们可以看到,在UML类图中单向关联用一个带箭头的直线表示。上图表示每个顾客都有一个地址,这通过让Customer类持有一个类型为Address的成员变量类实现。plaintext: ``` @startuml
class Customer{
- address: Address }
class Address{
} Customer —> Address
@enduml
<a name="wam2K"></a>### 双向关联从上图中我们很容易看出,所谓的双向关联就是双方各自持有对方类型的成员变量。在UML类图中,双向关联用一个不带箭头的直线表示。上图中在Customer类中维护一个Product[]数组,表示一个顾客购买了那些产品;在Product类中维护一个Customer类型的成员变量表示这个产品被哪个顾客所购买。plaintext:
@startuml
class Customer{
- products:Product[] }
class Product{
- customer:Customer
} Customer “purchase”<—>”is sold to” Product @enduml
<a name="A2bSI"></a>### 自关联自关联在UML类图中用一个带有箭头且指向自身的直线表示。上图的意思就是Node类包含类型为Node的成员变量,也就是“自己包含自己”。plaintext:
@startuml
class Node{
- subNode:Node }
Node —> Node : contains @enduml
<a name="xLLb0"></a>## 聚合关系上图中的Car类与Engine类就是聚合关系(Car类中包含一个Engine类型的成员变量)。由上图我们可以看到,UML中聚合关系用带空心菱形和箭头的直线表示。聚合关系强调是“整体”包含“部分”,但是“部分”可以脱离“整体”而单独存在。比如上图中汽车包含了发动机,而发动机脱离了汽车也能单独存在。plaintext:
@startuml
class Car{
- engine: Engine
- Car(Engine engine)
- setEngine(Engine engine) : void } class Engine{ }
Car o— Engine : contains @enduml
<a name="N2qma"></a>## 组合关系组合关系与聚合关系见得最大不同在于:这里的“部分”脱离了“整体”便不复存在。比如下图:<br />显然,嘴是头的一部分且不能脱离了头而单独存在。在UML类图中,组合关系用一个带实心菱形和箭头的直线表示。plaintext:
@startuml
class Head{
- mounth: Mouth+ Head()
} class Mouth{ }
Head *— Mouth : has @enduml
<a name="y0nUQ"></a>## 依赖关系从上图我们可以看到,Driver的drive方法只有传入了一个Car对象才能发挥作用,因此我们说Driver类依赖于Car类。在UML类图中,依赖关系用一条带有箭头的虚线表示。plaintext:
@startuml class Driver{
+ drive(Car car) : void
} class Car{
+ move() :void
} Car <.. Driver @enduml
<a name="OhdTm"></a>## 继承关系继承关系对应的是extend关键字,在UML类图中用带空心三角形的直线表示,如下图所示中,Student类与Teacher类继承了Person类。plaintext:
@startuml class Person{
# name :String# age :int+ move():void+ say() :void
} class Student{
- studentNo :String+ study() :void
} class Teacher{
- teacherNo :String+ teach() :void
} Person <|— Student Person <|— Teacher @enduml
<a name="XNh7Y"></a>## 接口实现关系这种关系对应implement关键字,在UML类图中用带空心三角形的虚线表示。如下图中,Car类与Ship类都实现了Vehicle接口。下图中car和ship都是Vegicle的实现plaintext
@startuml class Vehicle{
+ move() :void
} class Ship{
+ move() :void
} class Car{
+ move() :void
} Vehicle <|.. Ship Vehicle <|.. Car @enduml ```
