Understanding UML in seconds
UML 是一种分析设计语言,也就是一种建模语言。
UML结构解析
UML其结构主要包括以下几个部分:
- 视图(View)
多个图形组成的集合; - 图(Diagram)
图的种类有13种图,但常用的也就两种(1.需求用例图,2.开发类图); - 模型元素(Model Element)
如类、对象、消息以及这些概念之间的关系,如关联关系、依赖关系、泛化关系等; - 通用机制(General Mechanism)
UML提供的通用机制为模型元素提供额外的注释、信息和语义(没啥用);
开发类图
类图(Class Diagram)主要用来描述不同的类以及它们之间的关系。
类图的三段式结构为:
| 类名 |
|---|
| 类的属性 |
| 类的操作 |
类图示例

对应的Java代码

观察后发现,图和代码的差别不大,无非是类型写在变量后面而已。
UML规定类属性的表示方式为:

UML规定类操作的表示方式为:

注意:如果是构造方法,则无返回类型。
其中:可见性表示该属性对于类外的元素而言是否可见,包括:
- 公有(public), 在类图中分别用符号
+表示; - 私有(private), 在类图中分别用符号
-表示; - 受保护(protected),在类图中分别用符号
#表示;
这个元素或这个方法对这个类及其子类的其他元素可见。 - 包可见性,对同一个包中的其他元素可见,在类图中分别用符号
*表示;
Java用protected修饰类成员时,该成员可被其所属类的子类以及与其所属类处于同一包中的其他类所访问。
类图间的关系
一共九种关联关系,他们的符号可以记不住,这个没关系,用到再回来查。但是,他们各个图间的关系概念得分辨明晰,不要有含混不明的地方。
- 关联关系(有6种)
- 1.1 双向关联
- 默认情况下,关联是双向的;
- 在UML种用一个根实线连接两个类表示。
- 1.2 单向关联
- 类的关联关系也可以是单向的,在UML中单向关联用带箭头的实线表示。
- 1.3 自关联
- 在系统中可能会存在一些类的属性对象类型为该类本身,这种特殊的关联关系称为自关联。
- 1.4 多重关联
- 表示两个关联对象在数量上的对应关系;
- 在UML中,对象之间的多重性可以直接在关联直线上用一个数字或一个数字范围表示。
- 1.5 聚合关系(Aggregation)
- 聚合关系表示整体与部分的关系;
- 组合关系与聚合关系的区别在于生命周期的管理。在聚合关系中,整体对象和部分对象之间的关联是比较宽松的,部分对象可以独立存在而不受整体对象的控制。
- 在UML中,聚合关系用带空心菱形的直线表示。
- 1.6 组合关系(Composition)
- 组合关系也表示类之间整体和部分的关系;
- 组合关系与聚合关系的区别在于生命周期的管理。在组合关系中,整体对象拥有和管理部分对象的全生命周期;
- 在UML中,组合关系用带实心菱形的直线表示;
- 1.1 双向关联
- 依赖关系
- 依赖(Dependency)关系是一种使用关系;
- 大多数情况下,依赖关系体现在某个类的方法使用另一个类的对象作为参数。
- 在UML中,依赖关系用带箭头的虚线表示,由依赖的一方指向被依赖的一方。
- 泛化关系
- 泛化(Generalization)关系也就是继承关系,用于描述父类与子类之间的关系;
- 在UML中,泛化关系用带空心三角形的直线来表示。
- 接口与实现关系
- 在接口中,通常没有属性,而且所有的操作都是抽象的,只有操作的声明,没有操作的实现;
- 接口之间也可以有与类之间关系类似的继承关系和依赖关系,但是接口和类之间还存在一种实现(Realization)关系。在这种关系中,类实现了接口,类中的操作实现了接口中所声明的操作。
- 在UML中,类与接口之间的实现关系用带空心三角形的虚线来表示。
双向关联
- 双向关联类似 我拥有你,你也拥有我;
- 在UML种用一个根实线连接两个类表示。
例如,顾客(Customer)购买商品(Product)并拥有商品,反之,卖出的商品总有某个顾客与之相关联。因此,Customer类和Product类之间具有双向关联关系,如下图。

public class Customer {
private Product[] products;
}
public class Product {
private Customer customer;
}
单向关联
- 类的关联关系也可以是单向的,就类似 我拥有你,但你不能拥有我;
- 在UML中单向关联用带箭头的实线表示。

public class Customer {
private Address address;
}
public class Address {}
自关联
- 这个也是单向关联,只是指向的不是别人,是自己。
- 在系统中可能会存在一些类的属性对象类型为该类本身,这种特殊的关联关系称为自关联。
- 例如,一个节点类(Node)的成员又是节点Node类型的对象,

public class Node {
private Node node;
}
多重性关联
这个应该是最复杂的,需要好好看看;
- 又称为重数性(Multiplicity)关联关系,表示两个关联对象在数量上的对应关系。
- 多重性应用于关联的目标端,说明源类的每个实例与目标类实例的连接个数。除非显式说明,否则关系的多重性就是未指定的。
- 在UML类图中,关系连线的两端有时会有1..1、*..1等符号,通过下图来做一个说明。
用一个数字或一个数字范围表示, 这里的数字范围一遍指符号,下面有说明表格。
符号说明:

例如:一个界面(Form)可以拥有零个或多个按钮(Button),但是一个按钮只能属于一个界面,因此,一个Form类的对象可以与零个或多个Button类的对象相关联,但一个Button类的对象只能与一个Form类的对象关联,如下图:

对应的Java代码:
public class Form {
private Button[] buttons; //定义一个集合对象
}
public class Button {}
注意: 类之间的多重性有时会直接在关系连线上用一个数字表示,其实这种是不严谨的表示法,
多重性描述的是关系连线的两端,自然要将两端的范围都描述清楚,只写一个数字,会让人不清楚是头还是尾,引起混乱!
聚合关系
- 是一种描述 整体与成员间的关系;
- 在聚合关系中,成员对象是整体对象的一部分,但是成员对象可以脱离整体对象独立存在;
- 简而言之,整体死去了,成员还活着;
- 在UML中,聚合关系用带空心菱形的直线表示。

在代码实现聚合关系时,成员对象通常作为构造方法、Setter\Getter方法或业务方法的参数注入到整体对象中,对应的Java代码片段如下:
public class Car {
private Engine engine;
//构造注入
public Car(Engine engine) {
this.engine = engine;
}
//设值注入
public void setEngine(Engine engine) {
this.engine = engine;
}
}
public class Engine {
// ...
}
组合关系
- 是一种描述 整体与成员间的关系;
- 在组合关系中整体对象可以控制成员对象的生命周期,一旦整体对象不存在,成员对象也将不存在,成员对象与整体对象之间具有同生共死的关系
- 简而言之,整体死去了,成员也死了;
- 在UML中,组合关系用带实心菱形的直线表示;
例如:人的头(Head)与嘴巴(Mouth),嘴巴是头的组成部分之一,而且如果头没了,嘴巴也就没了,因此头和嘴巴是组合关系。

public class Head {
private Mouth mouth;
public Head() {
this.mouth = new Mouth(); //实例化成员类
}
}
public class Mouth {
// ...
}
依赖关系案例
在UML中,依赖关系用带箭头的虚线表示,由依赖的一方指向被依赖的一方。

对应的Java代码:
public class Driver {
public void drive(Car car){
car.move();
}
}
public class Car {
public void move(){
// ...
}
}
泛化关系案例
在UML中,泛化关系用带空心三角形的直线来表示。

对应的Java代码:
//父类
public class Person (
protected String name;
protected int age;
public void move( ) {
// ...
}
public void say( ) {
// ...
}
}
//子类
public class Student extends Person {
private String teacherNo;
public void study( ) {
// ...
}
}
//子类
public class Teacher extends Person {
private String teacherNo;
public void teach() {
// ...
}
}
接口与实现关系案例
在UML中,类与接口之间的实现关系用带空心三角形的虚线来表示。

对应的Java代码
public interface Vehicle {
public void move()
}
public class Ship implements Vehicle {
public void move(){
// ...
}
}
public class Car implements Vehicle {
public void move() {
// ...
}
}
Understanding UML in seconds的更多相关文章
- Game Development Patterns and Best Practices (John P. Doran / Matt Casanova 著)
https://github.com/PacktPublishing/Game-Development-Patterns-and-Best-Practices https://github.com/m ...
- Linux 日志报错 xxx blocked for more than 120 seconds
监控作业发现一台服务器(Red Hat Enterprise Linux Server release 5.7)从凌晨1:32开始,有一小段时间无法响应,数据库也连接不上,后面又正常了.早上检查了监听 ...
- I/O requests taking longer than 15 seconds to complete on file I/O瓶颈问题
I/O requests taking longer than 15 seconds to complete on file I/O瓶颈问题 http://mssqlwiki.com/2012/08/ ...
- UML中关联(Association)、聚合(Aggregation)和合成(Composition)之间的区别
本文为 Dennis Gao 原创技术文章,发表于博客园博客,未经作者本人允许禁止任何形式的转载. 现在,我们需要设计一个项目管理系统,目前我们收集到了如下这些需求: REQ1:一个项目内有多名项目成 ...
- Understanding CMS GC Logs--转载
原文地址:https://blogs.oracle.com/poonam/entry/understanding_cms_gc_logs Understanding CMS GC Logs By Po ...
- Understanding G1 GC Logs--转载
原文地址:https://blogs.oracle.com/poonam/entry/understanding_g1_gc_logs Understanding G1 GC Logs By Poon ...
- (转)The 9 Deep Learning Papers You Need To Know About (Understanding CNNs Part 3)
Adit Deshpande CS Undergrad at UCLA ('19) Blog About The 9 Deep Learning Papers You Need To Know Abo ...
- Understanding Asynchronous IO With Python 3.4's Asyncio And Node.js
[转自]http://sahandsaba.com/understanding-asyncio-node-js-python-3-4.html Introduction I spent this su ...
- Understanding Convolution in Deep Learning
Understanding Convolution in Deep Learning Convolution is probably the most important concept in dee ...
- The Guide To Understanding mysqlreport
The Guide To Understanding mysqlreport This guide to understanding mysqlreport explains everything t ...
随机推荐
- springboot+springsecurity+jwt+elementui图书管理系统
图书管理系统 一.springboot后台 1.mybatis-plus整合 1.1添加pom.xml <!--mp逆向工程 --> <dependency> < ...
- GPT虚拟直播Demo系列(二)|无人直播间实现虚拟人回复粉丝
摘要 虚拟人和数字人是人工智能技术在现实生活中的具体应用,它们可以为人们的生活和工作带来便利和创新.在直播间场景里,虚拟人和数字人可用于直播主播.智能客服.营销推广等.接入GPT的虚拟人像是加了超强b ...
- [MAUI程序设计] 用Handler实现自定义跨平台控件
@ 目录 Handler 与Xamarin.Forms实现的区别 为什么要用Handler代替Renderer 解耦 生命周期管理 更细粒度的控制 用Effect来实现呢? 自定义手势监听控件 在各平 ...
- 使用镜像加速 Rtools 下载与安装
在 windows 使用 R,尤其是安装 R 包的时候,经常会遇到一些 Rtools 的问题,今天聊一下. Rtools 是什么 Rtools 作用很大,但我们一般不怎么会直接使用. Rtools p ...
- 可视化生信分析利器 Galaxy 之 Docker 部署
Galaxy Project(https://galaxyproject.org/)是很多年前在云计算背景下诞生的一个生物信息学可视化分析开源项目, 是目前生物医学研究领域最受欢迎的在线生物信息分析工 ...
- 信息收集_网络扫描_nmap
信息收集_网络扫描nmap 目标说明 -iL <inputname> (从列表或文件输入) -iR <hostnum> (随机选择生成目标数量) --exclude <h ...
- 10.5. 版本控制(如Git)
版本控制系统(Version Control System,VCS)是软件开发过程中用于管理源代码的工具.它可以帮助你跟踪代码的变更历史,方便回滚到之前的版本,以及协同多人共同开发.Git是当前最流行 ...
- ENVI5.6 安装教程,新手入门(超详细)附安装包和常见问题
ENVI是一个完整的遥感图像处理平台,广泛应用于科研.环境保护.气象.农业.林业.地球科学.遥感工程.水利.海洋等领域.目前ENVI已成为遥感影像处理的必备软件,包含辐射定标.大气校正.镶嵌裁剪.分类 ...
- 洛谷 P5979 [PA2014] Druzyny
简要题意 有 \(n\) 个人,把他们划分成尽可能多的区间,其中第 \(i\) 个人要求它所在的区间长度大于等于 \(c_i\),小于等于 \(d_i\),求最多的区间数量以及如此划分的方案数. 数据 ...
- 编译器性能调优:使用C++11实现高效编译器
目录 1. 引言 2. 技术原理及概念 2.1. 基本概念解释 2.2. 技术原理介绍 <编译器性能调优:使用C++11实现高效编译器> 编译器是计算机程序的入口点,将源代码转换为可执行文 ...