参考资料:

统一建模语言 - Wiki

设计模式和 UML 类图 - 非常好的资料

继承、实现、依赖、关联、聚合、组合的联系与区别

领域 UML 类图和实现 UML 类图对比

processon - 在线绘制工具

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

UML 图形

官方定义

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

UML 类图(Class Diagram)

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

UML 时序图(Sequence Diagram)

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

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

领域 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

UML 类图快速入门的更多相关文章

  1. UML类图快速入门篇

    1.关联 1.1双向关联: C1-C2:指双方都知道对方的存在,都可以调用对方的公共属性和方法. 在GOF的设计模式书上是这样描述的:虽然在分析阶段这种关系是适用的,但我们觉得它对于描述设计模式内的类 ...

  2. UML类图简介

    概述 设计模式中常常使用UML来表示类与类,类与接口之间的关系,UML类图是设计模式入门必备的技能,感觉各种关系比较多,这里做一下总结. 类与接口的表示 类与接口通常是一个矩形框表示,一般分为3层,第 ...

  3. UML类图(Unified Modeling Language Class Diagrams)

    统一建模语言(UML) |  类图 什么是UML? UML是一种用于可视化描述系统,具有广泛用途的建模语言.作为一种标准化的图形语言,在软件工业中被用于软件系统部件的具体化,可视化,结构化描述以及撰写 ...

  4. ABP源码uml类图

    陆陆续续学习ABP框架有一段时间了,阳光铭睿的入门教程和HK Zhang的源码分析文章对我的学习帮助都很大.之所以会花这么大工夫去学习ABP.看ABP的源代码,一是因为本人对于DDD也非常有兴趣,AB ...

  5. OO第四单元总结——查询UML类图 暨 OO课程总结

    一.本单元两次作业的架构设计总结 作业一.UML类图查询 1. 统计信息图 2. 复杂度分析 基本复杂度(Essential Complexity (ev(G)).模块设计复杂度(Module Des ...

  6. UML类图详解和示例

    ps:博客园markdown不能自动生成列表,更好的阅读体验可访问我的个人博客http://www.isspark.com/archives/UMLDescription UML类图概述 什么是UML ...

  7. 最全Pycharm教程(43)——Pycharm扩展功能之UML类图使用 代码结构

    版权声明:本文为博主原创文章,转载时麻烦注明源文章链接,谢谢合作 https://blog.csdn.net/u013088062/article/details/50353202 1.什么是UML ...

  8. UML类图(下):关联、聚合、组合、依赖

    前言 上一篇文章UML类图(上):类.继承.实现,讲了UML类图中类.继承.实现三种关系及其在UML类图中的画法,本文将接着上文的内容,继续讲讲对象之间的其他几种关系,主要就是关联.聚合.组合.依赖, ...

  9. UML类图(上):类、继承和实现

    面向对象设计 对于一个程序员来说,在工作的开始阶段通常都是别人把东西设计好,你来做.伴随着个人的成长,这个过程将慢慢变成自己设计一部分功能来实现,自己实现.如果要自己设计,无论是给自己看,还是给别人看 ...

随机推荐

  1. 本地SVN服务器的搭建(WINDOWS环境)

    1.下载安装 VISUALSVN SERVER 1.1下载地址:https://www.visualsvn.com/server/download/ 1.2下载完成后,双击安装. 2.下载安装 Tor ...

  2. 洛谷P2460 [SDOI2007]科比的比赛(题解)(贪心+搜索)

    科比的比赛(题解)(贪心+搜索) 标签:算法--贪心 阅读体验:https://zybuluo.com/Junlier/note/1301158 贪心+搜索 洛谷题目:P2460 [SDOI2007] ...

  3. C# ASP.NET 手写板并生成图片保存

    前端: @{ Layout = null; } <!DOCTYPE html> <html lang="zh-CN"> <head> <t ...

  4. C# String的几种比较方法对比(Compare,CompareTo, CompareOrdinal、Equals)

    原文:http://blog.csdn.net/wushang923/article/details/7527499 注意点:切换方法的时候要注意返回值引起的变化!!! 1.Compare会通过传递进 ...

  5. NIO的缓冲区、通道、选择器关系理解

    Buffer的数据存取    一个用于特定基本数据类行的容器.有java.nio包定义的,所有缓冲区都是抽象类Buffer的子类.   Java NIO中的Buffer主要用于与NIO通道进行交互,数 ...

  6. React与Typescript整合

    0. Typescript Typescript对于前端来说可以说是越来越重要了,前端的很多项目都用Typescript进行了重构.这主要得益于Typescript有比较好的类型支持,在编码的过程中可 ...

  7. sqoop简单使用

    一,通过sqoop将MySQL里面的数据加载到HDFS 先查看有哪些数据库 查看表person sqoop list-databases --connect jdbc:mysql://ly-p2p4: ...

  8. ln 硬链接与软链接

    1. 命令功能 ln 可以看做是link的简写,功能是创建链接文件,链接文件包括硬链接(hard link)和软链接(符号链接,symbolic link) 2. 语法格式 ln  [option]  ...

  9. uboot中Kconfig架构的理解

    1./u-boot-2019.07/Kconfig 是顶层Kconfig mainmenu "U-Boot $UBOOTVERSION Configuration"  #这是总me ...

  10. [python 学习] sax

    #!/usr/bin/python # -*- coding: UTF-8 -*- import xml.sax class MovieHandler( xml.sax.ContentHandler ...