参考资料:

统一建模语言 - 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. Netty实战之性能调优与设计模式

    设计模式在Netty 中的应用(回顾): 单例模式要点回顾: 一个类在任何情况下只有一个对象,并提供一个全局访问点. 可延迟创建. 避免线程安全问题. 在我们利用netty自带的容器来管理客户端链接的 ...

  2. SpringBoot(五) -- SpringBootWeb登录示例

    一.解决index.html访问 在SpringBoot中默认访问的首页是静态资源文件夹下的index.html,无法被Thymeleaf模板引擎解析,因此我们可以定义一个controller将默认请 ...

  3. PHP中的异常和错误(转载)

    博客好久没有更新了,实在惭愧,最近在忙人生大事,哈哈!这段时间没有看什么新的东西,结合项目中遇到的PHP异常处理问题,我又重新梳理了之前模糊的概念,希望对大家理解PHP异常处理有所帮助. 请一定要注意 ...

  4. 如何配置属于自己的Git账户

    如何配置属于自己的Git账户:https://jingyan.baidu.com/article/3d69c55123e556f0cf02d730.html

  5. ubuntu 虚拟机配置 IP、子网掩码、网关、DNS

    ubuntu 虚拟机配置 IP.子网掩码.网关.DNS 执行 sudo vim /etc/network/interfaces 添加如下配置: auto eth0 iface eth0 inet st ...

  6. JVM-堆内存

    1. java堆内存介绍 java的堆内存可以类比于计算机的内存,是存储整个机器数据的地方. (1)jvm一起动就创建java堆.类比计算机一起动就加载内存. (2)所有的线程共享.类比计算机所有进程 ...

  7. 洛谷 P1525 关押罪犯 & [NOIP2010提高组](贪心,种类并查集)

    传送门 解题思路 很显然,为了让最大值最小,肯定就是从大到小枚举,让他们分在两个监狱中,第一个不符合的就是答案. 怎样判断是否在一个监狱中呢? 很显然,就是用种类并查集. 种类并查集的讲解——团伙(很 ...

  8. ex2、逻辑回归

    介绍: 在本练习中,您将实现逻辑回归,并将其应用于两个不同的数据集.在开始编程练习之前,我们强烈要求建议观看视频讲座并完成相关主题的问题.要开始练习,您需要下载起始代码并将其内容解压缩到要完成练习的目 ...

  9. Python之文件和异常IO

    文件和异常 读写文本文件 读取文本文件时,需要在使用open函数时指定好带路径的文件名(可以使用相对路径或绝对路径)并将文件模式设置为'r'(如果不指定,默认值也是'r'),然后通过encoding参 ...

  10. 关于python - 更优雅的技巧

    枚举 不要这么做: i = 0 for item in iterable: print i, item i += 1 而是这样: for i, item in enumerate(iterable): ...