UML 类图快速入门

参考资料:
统一建模语言 - Wiki
设计模式和 UML 类图 - 非常好的资料
继承、实现、依赖、关联、聚合、组合的联系与区别
领域 UML 类图和实现 UML 类图对比
processon - 在线绘制工具

UML 是一种绘画语言,用来做软件蓝图。其意图仅仅是建立产品的模型和结构,跟具体的程序语言和算法实现无关。

UML 图形

官方定义

官方定义的 UML 图形有十几种。

UML 类图(Class Diagram)

面向对象编程中,最常用的就是 UML 类图,描述了系统中的对象和关系。借助 UML 类图,可以在编写代码以前对系统有一个全面的认识。

UML 时序图(Sequence Diagram)

消息在生命线上按照约定顺序执行。

例如,微信支付业务流程的这个 时序图

领域 UML 类图和实现 UML 类图

在领域驱动设计中,在系统开始编码前,一般要经过业务分析和项目设计两个阶段。业务分析过程中产生领域 UML 类图,项目设计过程中产生实现 UML 类图。

领域 UML 类图

由业务分析师产生,描述业务实体、每个实体的属性和操作、实体之间的关系。
领域 UML 类图

实现 UML 类图

由系统设计师完成。包括系统中所有有必要指明的实体类、控制类、界面类及与具体平台有关的所有技术性信息。

下面是个简单例子,实际要比这个复杂:
类图关系

UML 关系

UML 中的元素通过关系关联到一起。

各种关系的强弱顺序:泛化 = 实现 > 组合 > 聚合 > 关联 > 依赖

泛化关系(generalization)

用空心三角箭头加实线表示。

两个对象之间如果可以用 is-a 来表示,就是继承关系。

代码中,就是继承非抽象类。

public class Car {

}

public class SUV extends Car {

}

实现关系(realize)

用空心三角箭头加虚线表示。

代码中,就是继承抽象类或实现接口。

public interface Human {

}

public class Student implements Human {

}

关联关系(association)

用带箭头的实线表示。

关联关系是一种强依赖关系,比如我和我的朋友。

关联关系默认不强调方向,表示对象间相互知道。如果强调方向,A 指向 B 的箭头表示 A 知道 B,但 B 不知道 A。

在代码中,关联关系通常是以成员变量的形式实现的。

例如,下面示例中 Employee 类对 IDCard 类有关联关系,Employee 可以有 0 个或多个 IDCard 对象,但每个 IDCard 只从属于一个 Employee:

public class Employee {
    private IDCard id;
}

依赖关系(dependency)

用带箭头的虚线表示。

依赖是临时性的、非常弱的关系。例如某人过河时借用一条船,人对船产生依赖。

依赖是有方向的,双向依赖是非常糟糕的结构,尽量避免。A 指向 B 的箭头表示 A 依赖 B,在 A 运行期间会用到 B 对象的关系。

在代码中,依赖关系体现为类构造方法及类方法的传入参数,箭头的指向为调用关系。

例如,下面示例中 Employee 类对 CalculatorStrategy 类有依赖关系:

public class Employee {
    public void calcSalary(CalculatorStrategy cg) {
        ...
    }
}

组合关系(composition)

用实心菱形箭头加实线表示,A 指向 B 的箭头表示 A 组成 B,或 B 由 A 组成。

组合关系是 contains-a 的关系,整体消亡后,各个组成元素跟着一起消亡。例如公司解散后,各个部门也不存在了。汽车销毁后,发动机等组件都被同时销毁。

例如,下面示例中 Car 类由 Engine 等类组合而成,Car 负责 Engine 的生命周期:

public class Car {
    private Engine eng;
    public void maintainEngine() {
        ...
    }
}

聚合关系(aggregation)

用空心菱形箭头加实线表示,A 指向 B 的箭头表示 A 聚合到 B 上,或 B 由 A 组成。

聚合关系是 has-a 的关系,各个元素有单独的生命周期。即使整体不在了,各个组成元素仍可以独立存在。例如部门解散后员工仍在。

public class Department {
    private Employee emp;
}

UML 类和关系

类名

UML 中使用带有类名的方框表示类。对于抽象类,可以使用斜体或在类名下面添加 {abstract}。对于接口,可以在类名上面添加 <<interface>>

属性和方法

在 UML 类图中,属性和方法前面可以使用 +-# 三种符号表示其可见性。

符号 可见性 说明
+ public 所有代码都可以访问
- private 只有当前类可以访问
# protected 只有当前类及其子类可以访问

可见性符号后面是属性名或方法名。用冒号分隔属性的类型和默认值

- id:int
- price: doube=0

对于方法,括号中可以指定参数及其类型,冒号后面是返回值类型:

+ getPrice(id: int): double

这里写图片描述

posted on 2018-06-27 18:06  kikajack  阅读(513)  评论(0编辑  收藏  举报