转载来源:http://blog.csdn.net/shift_wwx/article/details/79205187

可以参考:http://www.uml.org.cn/oobject/201211231.asp

一、前言

在软件开发过程中会经常整理文档,不是所有的信息都可以通过文字来表达,而换成图之后会更加的直观、有效,其中频繁使用的就是UML图。结合自己实践总结一下,希望对大家都能有所帮助。

本文中的UML图都是用visio 绘制,source code展示是Java 语言。

二、UML简介

Unified Modeling Language (UML)又称统一建模语言或标准建模语言,是始于1997年一个OMG标准,它是一个支持模型化和软件系统开发的图形化语言,为软件开发的所有阶段提供模型化和可视化支持,包括由需求分析到规格,到构造和配置。 面向对象的分析与设计(OOA&D,OOAD)方法的发展在80年代末至90年代中出现了一个高潮,UML是这个高潮的产物。它不仅统一了Booch、Rumbaugh和Jacobson的表示方法,而且对其作了进一步的发展,并最终统一为大众所接受的标准建模语言。

UML图包括两个范畴:结构图和行为图。

结构图的目的是显示建模系统的静态结构。它包括类、组件和对象。例如UML静态结构图。

行为图的目的是显示系统中对象的动态行为。它包括对象的方法、协作和活动之类的内容。例如UML示例图、UML活动图、UML序列图。

三、UML类图

通过UML类图可以将类之间的所有关系(泛化、实现、关联、聚合、组合、依赖)都能具体的体现出来。

1、类图的表示

类的 UML 表示是一个长方形,垂直地分为三个区,如下图所示。顶部区域显示类的名字。中间的区域列出类的属性。底部的区域列出类的操作。在一个类图上画一个类元素时,你必须要有顶端的区域,下面的二个区域是可选择的(当图描述仅仅用于显示分类器间关系的高层细节时,下面的两个区域是不必要的)。

顶端是类名,中间列出的是类的属性。底部列出的是类的操作。在绘制类图的时候,顶端部分是必须的,其他两个部分可选。

类名:如果是抽象类,采用斜体。

类属性列表:可见性 + 属性名 + 冒号 + 属性类型 + (等号 + 默认值)

属性的可见性下面会说明;属性的类型看属性而定,可以是int,可以是boolean;有的属性可能会有默认值,在类型之后加等号和默认值。

类方法列表:可见性 + 函数名 + (参数列表) + 冒号 + 返回值类型

可见性:

标志 可见性类型
+ public
- private
# protected
~ package

2、继承的表示

为了在一个类图上建模继承,从子类(要继承行为的类)拉出一条闭合的单键头(或三角形)的实线指向超类。

ViewGroup 和 方法onLayout 用的是斜体,说明ViewGroup 是抽象类,方法onLayout 是抽象的。

3、接口的表示

一个类和一个接口不同:一个类可以有它形态的真实实例,然而一个接口必须至少有一个类来实现它。在 UML 中,一个接口被认为是类建模元素的特殊化。因此,接口就象类那样绘制,但是长方形的顶部区域也有文本“interface”。

对于接口,如果用<< 和 >>将字符串interface包起来,表示这是个接口类。并且用虚线带三角形的箭头从实现类指向Interface 类。

4、关联的表示

(1)双向关联

在两个类之间用实线连接,表示两个类彼此都知道它们之间的联系。

在实线的上端写上关联关系,例如 has;在实线的下端写上可能的多重值,多重值表示如下:

表示 含义
0..1 0个或者1个
1 只能1个
0..* 0个或者多个
* 0个或者多个
1..* 1个或者多个
3 只能3个
0..3 0至3个
3..13 3至13个

(2)单向关联

单向关联是用一个实线带一个开放的箭头,表示一端知道箭头指向的另一端。

上图中View 中包含Canvas 类,而Canvas 中不需要包含View。

5、聚合的表示

聚合是一种特别类型的关联,用于描述“总体到局部”的关系。在基本的聚合关系中,部分类的生命周期独立于整体类的生命周期。用一个带空心的菱形的实线表示,菱形指向的是整体的类。

例如,汽车和轮子的关系:

聚合与单向关联的区别在于:单项的关联可能只是一个简单的“包含、引用”关系,关联和被关联类之间在逻辑概念上不一定有紧密的联系,而聚合则不同,它表示的是一种内在关系紧密,相互依存,相互包含的概念,其中的一部分是构成另外一部分的不可或缺的成分。

6、组合的表示

组合聚合关系是聚合关系的另一种形式,但是子类实例的生命周期依赖于父类实例的生命周期。

用一个带实心的菱形的实线表示,菱形指向的是整体的类。

组合跟聚合有很大的不同,聚合的部分的生命周期独立于整体,整体结束那不影响部分。而组合是部分的生命周期依赖与整体,整体结束,部分没有必要存在。就想公司和部分,公司都不存在了,那部门就没有存在的必要了,解散了算。

同样用View 为例:

其中的DeclaredOnclickListener 类是View的一部分,而且是依赖View的生命周期。

7、依赖的表示

依赖(Dependency)关系是一种使用关系,特定事物的改变有可能会影响到使用该事物的其他事物,在需要表示一个事物使用另一个事物时使用依赖关系,大多数情况下依赖关系体现在某个类的方法使用另一个类的对象作为参数。在UML中,依赖关系用带箭头的虚线表示,由依赖的一方指向被依赖的一方。

依赖关系通常通过三种方式来实现:

  • 将一个类的对象作为另一个类中方法的参数
  • 在一个类的方法中将另一个类的对象作为其对象的局部变量
  • 在一个类的方法中调用另一个类的静态方法

关联关系、聚合、组合之间的区别:

关联关系跟突出的是has,只是has的关系,可以通过这一层关系调用到另一个对象中的某个方法。

聚合、组合更突出“整体-部分”的关系,不单单是“拥有”,部分类是构成整体类的一部分。

对于聚合、组合,区别就在于部分类的生命周期如何,如果部分类还可以独立存在,那属于聚合关系;如果部分类不能独立存在,那属于组合的关系。

UML 类图详解的更多相关文章

  1. UML类图详解_关联关系_一对多

    对于一对多的示例,可以想象一个账户可以多次申购.在申购的时候没有固定上限,下限为0,那么就可以使用容器类(container class)来搞,最常见的就是vector了. 下面我们来看一个“一对多” ...

  2. UML类图详解_关联关系_多对一

    首先先来明确一个概念,即多重性.什么是多重性呢?多重性是指两个对象之间的链接数目,表示法是“下限...上限”,最小数据为零(0),最大数目为没有设限(*),如果仅标示一个数目级上下限相同. 实际在UM ...

  3. UML类图详解

    下面是类图的实例: (注:飞翔接口那里应为空心三角形) UML中类图实例 接口:空心圆+直线(唐老鸭类实现了‘讲人话’):依赖:虚线+箭头(动物和空气的关系):关联:实线+箭头(企鹅需要知道气候才迁移 ...

  4. UML类图详解_泛化关系

    泛化其实就是继承关系,还是比较简单的,那么我们就把之前有些问题的博客UML类图重新来实现一次. 依旧是这个图 下面我们来看一个例子 Account.h #include <cstdlib> ...

  5. UML类图详解和示例

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

  6. UML类图详解_组合关系

    组合关系和聚合关系有一个最大的不同,组合关系中的整体直接掌握部件的生灭,聚合关系中的整体并不具有生灭部件的权力.一旦组合中的整体不存在时,其组合部件也不能单独存在,必须同时消灭.另外,外界也不能直接与 ...

  7. UML类图详解_关联关系_多对多

    在关联关系中,很多情况下我们的多重性并不是多对一或者一对多的,而是多对多的. 不过因为我们要考虑里面的导航性,如果直接搞的话就是需要去维护两群对象之间多对多的互指链接,这就十分繁杂且易错.那么我们怎么 ...

  8. UML类图详解_聚合关系

    结合UML关系,以看台和基金来介绍聚合关系 aggregation,是一种特殊的关联关系,既有关联关系的特质,还独有“整体 —— 部分(whole —— part)”的特质. 也就是说,用之前的关联关 ...

  9. UML简单介绍—类图详解

    类图详解 阅读本文前请先阅读:UML简单介绍—类图这么看就懂了 1.泛化关系 一个动物类: /** * 动物类 */ public class Animal { public String name; ...

随机推荐

  1. Cordova - OSX中,nodev7.5.0无法安装cordova解决方法!

    OSX:10.12.3 node:v7.5.0 结果很搞笑啊,先前怎么安装都不成功,现在居然安装成功了!我认为安装失败最大的原因是:你不能访问谷歌的原因!!!! 使用最新稳定版,有助于安装,可以顺便安 ...

  2. Delphi - 10.1编译OSX10.12程序遇到错误解决了!

    昨天,尝试Delphi的跨平台开发功能,在windows10下,做了一个控制台程序,发布目标平台是OSX10.12,中间配置过程都非常顺利,没有任何错误,但是当编译运行时候出现下面错误: [dccos ...

  3. docker 搭建Mysql集群

    docker基本指令: 更新软件包 yum -y update 安装Docker虚拟机(centos 7) yum install -y docker 运行.重启.关闭Docker虚拟机 servic ...

  4. python salt 实现windows账户自动化

    import random import string import json import logging import time import os import sys def usage(): ...

  5. 600. Non-negative Integers without Consecutive Ones

    Given a positive integer n, find the number of non-negative integers less than or equal to n, whose ...

  6. elasticsearch 分片(Shards)的理解

    分片重要性 Es中所有数据均衡的存储在集群中各个节点的分片中,会影响ES的性能.安全和稳定性, 所以很有必要了解一下它. 分片是什么? 简单来讲就是咱们在ES中所有数据的文件块,也是数据的最小单元块, ...

  7. vue学前班004(基础指令与使用技巧)

    我学vue 的最终目的是为了 做apicloud 和vue 的开发  作为配合apicloud的前端框架使用 所以项目用不到的会暂时不介绍. (强烈建议  官网案例走一遍) 基础指令的学习(结合aui ...

  8. Java爬虫项目实战(一)

    目的: 通过网络爬虫爬取中国最小粒度的区域维度信息,包括省(Province) .市(City).县(County).镇(town).村委会(village) 主网站链接: http://www.st ...

  9. Swift 学习指引

    以下指引是基于最新的 Swift 4.0 为基础为而言. 如你在参考3.0以下版本, 那你就不要说你会 Swift, 3.0 之前是 Objective-C 的搬迁(80%),是不成熟的语言, 看着很 ...

  10. Vim实用技巧系列 - 开篇

    作者使用Vim已经有一段时间了,深深觉得它是一个非常强大的编辑器,使用习惯之后效率很高.最大的缺点是学习曲线比较陡峭.因此作者希望分享一些自己在实际使用中的经验来帮助初学者,同时也帮助作者自己学习. ...