[转载]UML类图总结
前言
类图和序列图是UML中最常用的两种Diagram。我将做详细的总结。在许多书中,或者网站中,在介绍一个系统的子系统的设计时,很多时候,都是给出简单的类图来简述构成子系统的类之间的关系。这足以说明类图的重要性。 对类图的基本认识有以下两点:
- 类图是以反映类的结构(属性、操作)以及类之间的关系为主要目的,描述了软件系统的结构,是一种静态建模方法;
- 类图中的类与面向对象语言中的类的概念是对应的,是对现实世界中的事物的抽象。 我们基于以上两点,来对类图进行更详细的学习。
类图中基本语法学习
在UML中,画每一种图,都有一套规范的,不同的符号是不同的意义,我们要熟悉这些符号的意义,才能理解一副类图的意义。 先来一副画好的类图,从解析这个类图开始:

如图,这是一副很简单的类图,很简单,也很熟悉。 可以看到,这个类图,从上到下分为三部分。是的,一般类图从上到下分为三部分,分别是:
- 类名
- 属性
- 操作
正如你所看到的,上面类图的名称是Student,属性有Name, Sex, Age, 对应的操作有六个。你应该知道一个类图的Student是必须存在的,而属性和操作是可选的。如果,你看到了一个没有任何属性和操作的类时,也不要感到惊讶,那是正确,虽然不是很正常。 类的名字没有什么好说的,那么,我从属性开始,例如以下属性: - Name:String 如果你看过Objective-C,你也许就不会感到惊讶,为什么有减号和加号了,但是,伙计,这里的减号和加号和Objective-C中的意思是完全不同的。 这里的加号和减号表示的是属性和方法的可访问性,有如下定义:
- -表示private
- +表示public
- #表示protected
Name表示的是属性的名称,而它后面的String表示的是这个属性的类型; 那么现在对于- Name:String就好理解了;它表示Student类中定义的一个私有的String类型的属性Name;而对于图中这样的一个特例: - Age:int=10 在这里,int=10,表示的Age属性的默认值为10。
最下面是类的操作,“+”的意思,已经解释过了。我选取以下的一个操作进行详细讲解: + SetAge(Age:int):void 操作名为SetAge,参数为int类型的Age,操作的返回值为void。有的时候,我们会遇到以下的这种语法: + SetAge(in Age:int):void 是的,多了一个in关键字,这个关键字表示这个Age参数是输入参数,如果看过C#的话,理解其中的out关键字,我想in就不用我多讲了。
抽象类
看下面这个图:

你会发现类名和Eat方法是以斜体字体表示的;在类图中以斜体表示也是有特殊意义的,上图表示Animal是一个抽象类,抽象类是不能实例化的,一般至少包含一个抽象操作,比如上图的Eat就是抽象操作。
接口
看下图这个图:

这是接口的表示方法。接口是什么,不用做什么解释。这里让大家对接口图有一个大体的了解。
类图之间的关系
对于类图的基本讲解就到这里了,接下来讲解类图中最重要的一部分,也是比较难理解的一部分:类图之间的关系。 一个负责的系统,每个类不是独立存在的,而是类与类组织起来的,而每个类之间的关系是错综复杂的,那么UML是如何表达其中的关系的呢?
继承关系
继承关系是一种基本而重要的关系;至于继承的概念,我就不做解释了,而只讲UML中对继承的表示。

以上两张图,都是Astah中对继承关系的表示方法,继承通过指向超类的一条闭合的,单箭头的实线表示。这个表示和用例图中的泛化表示方式是一致的,不熟悉的朋友,可以去看看UML用例图总结这篇文章。
关联关系
当系统建模时,特定的对象间会彼此关联,而且这些关联本身需要被清晰地建模,这里我会介绍5中关联,关于什么时候使用哪种关联,这里是不做介绍的,这里而是将重点集中在每种关联的用途,并说明如何在类图上表现出来。
双向的关联

关联是两个类之间的连接,关联总是被假定是双向;这说明,两个类彼此知道它们之间的关系,都可以调用对方的公共属性和方法;虽然在分析阶段这种关系是适用的,但我觉得对于描述设计模式内的类关系来说显得太抽象了,因为在设计阶段关联关系必须被映射为对象引用或指针;对象引用本身就是有向的。这种关系在设计的时候比较少用到,关联一般都是有向的。
单向关联 在一个单向关联中,两个类是相关的,但是只有一个类知道这种关系的存在。如下图:

一个单向的关联,表示为一条带有指向已知类的开放箭头的实线。Class0知道Class1的存在,而Class1不知道Class0的存在,Class0可以调用Class1的公共属性和方法。使用Astah导出代码时,单向关联体现为Class0中包含一个Class1对象。
关联类 这个概念有点不好理解,我也是参考别人的理解,再做出自己的理解,如下图:

Person和Company是有关系的,存在什么关系?存在一个雇佣的关系,由于存在一个Job,导致Person和Company产生了关系,但是在建模时,由于Job将Person和Company关联到了一起,而描述Job的Salay放在Person或者Company都不是很合适的,由于不同的岗位有不同的Salary,如果将岗位和Salary放在Person,将导致Person类存在很高的耦合性。所以关联出一个关联类Job,表示岗位信息。从图中可以看出,Job类即是一个关联关系也是一个类,是为了描述类Person与类Company之间的关联关系的。
聚合 聚合是一种特别类型的关联,用于描述“总体到局部”的关系。 基本聚合 在基本聚合中,部分类的生命周期独立于整体类的生命周期;如下图:

房子是一个整体实体,而窗户是房子的一部分,而窗户可以在建房子之前就创建,在这里,Window实例清楚地独立地Car类实例而存在。使用空心的菱形表示。
组合聚合 组合聚合也叫包容,但是子类实例的生命周期依赖于父类实例的生命周期;如下图:

公司是一个整体实体,公司包含部门,部门不能独立于公司而存在。使用实心菱形表示。
自身关联(反射关联) 就是自身关联自身,你可能想不到这样存在的意义,但是,你要想到,类可以是抽象的,当一个类关联到它本身时,这并不意味着类的实例与它本身相关,而是类的一个实例与类的另一个实例相关,可以表现为多肽,在UML中就是如下图所示:

实现接口
如下图:

在UML中表示的很简单,就是将泛化中的实线变成了虚线就好了。
总结
这篇文章大体的对UML类图做了一个总结,平时工作中涉及到的内容都大体上做了介绍,如果有什么遗漏,请大家指出。同时,在本文中所有的类图都是使用Astah画的,关于使用Astah画类图,大家可以参考:UML工具Astah的使用。
附录
多重值和它们的表示
| 表示 | 含义 |
| 0..1 | 0个或1个 |
| 1 | 只能1个 |
| 0..* | 0个或多个 |
| * |
0个或多个
|
| 1..* | 1个或多个 |
| 3 | 只能3个 |
| 0..5 | 0到5个 |
| 5..15 | 5到15个 |
博客转自:《UML类图总结》
[转载]UML类图总结的更多相关文章
- [转载]uml 类图依赖与关联的区别
原文链接:https://www.cnblogs.com/liuzhang/archive/2013/03/17/2964095.html 最近研究设计模式,看类图有点发虚!有些关系搞的不是很清楚.所 ...
- 【转载】UML类图几种关系的总结
因为有的时候很久不弄UML图,老是忘记几个常见的连接线的意思,这篇完全说转载:UML类图几种关系的总结 在UML类图中,常见的有以下几种关系: 泛化(Generalization), 实现(Real ...
- 【转载】UML类图中箭头和线条的含义和用法
文章转载自 http://blog.csdn.net/hewei0241/article/details/7674450 https://blog.csdn.net/iamherego/article ...
- 转载:23种常用设计模式的UML类图
转载至:https://www.cnblogs.com/zytrue/p/8484806.html 23种常用设计模式的UML类图 本文UML类图参考<Head First 设计模式>(源 ...
- 【转载】UML类图知识整理
原文:UML类图知识整理 UML类图 UML,进阶必备专业技能,看不懂UML就会看不懂那些优秀的资料. 这里简单整理 类之间的关系 泛化关系(generalization) 泛化(generalize ...
- UML类图介绍(转载)
UML类图详细介绍 类图主要描述程序对象以及他们之间的关系.一般来说,类.接口.抽象类这些程序对象的区别很容易,但是他们之间六种关系以前总是理解不够深刻,这次进行了一次复习,顺便写成博文以便加深理 ...
- UML类图几种关系的总结 ---(转载)
在UML类图中,常见的有以下几种关系:泛化(Generalization), 实现(Realization),关联(Association),聚合(Aggregation),组合(Compositi ...
- [.net 面向对象程序设计深入](1)UML——在Visual Studio 2013/2015中设计UML类图
[.net 面向对象程序设计深入](1)UML——在Visual Studio 2013/2015中设计UML类图 1.UML简介 Unified Modeling Language (UML)又称统 ...
- UML类图归纳
作为一个程序员,掌握UML类图是开发和阅读程序的基础. 转载请注明地址http://www.cnblogs.com/zrtqsk/p/3739288.html,谢谢! 一.基本介绍 UML是一种标准的 ...
随机推荐
- 前端html、Javascript、CSS技术小结
简单地总结了一下前端用过的html.javascript.css技术,算是清点一下,做个大略的小结,为进一步的学习给个纲领. 一.HTML 由于HTML5的兴起,简单地判断一个网页是否是html5网页 ...
- [1002]prime
输入一个数,判断其是否为素数: 本题有多组测试样例. 输入规则如下: 第一行为一个整数,样例组数T: 第二至第t+1行每行都有一个整数a(a >= 2),表示需要处理的数: 如果是素数则输出“y ...
- Visual Studio2013(Update4)无法生成依赖项关系图解决方案
今天为了看别人写的一套框架,就琢磨着有没视图的方式去看别人每个类和方法之间的调用和继承关系.这个时候发现了一个VS2013自带的功能: 带着兴奋的心情小手一抖一点... 我等呀等,等呀等.... 尼玛 ...
- SQLSERVER中如何忽略索引提示
SQLSERVER中如何忽略索引提示 当我们想让某条查询语句利用某个索引的时候,我们一般会在查询语句里加索引提示,就像这样 当在生产环境里面,由于这个索引提示的原因,优化器一般不会再去考虑其他的索引, ...
- nodejs安装/运行脚本
本文主要介绍nodejs在windows下安装及运行脚本. 安装nodejs 先从nodejs官网:http://nodejs.org/下载对应的系统的安装包,比如用于64位系统的最新0.10.21的 ...
- windows 配置 apache + php
需要工具 apache 下载地址 php for windows (与apache同版本,使用线程安全)下载地址 vc (Visual Studio C++) 根据 apache 与 php 的版 ...
- 设计模式之美:Strategy(策略)
索引 意图 结构 参与者 适用性 效果 相关模式 实现 实现方式(一):使用不同的 Strategy 处理内部状态. 别名 Policy 意图 定义一系列的算法,把它们一个个封装起来,并且使它们可以相 ...
- 海量用户-高并发SAAS产品测试上线流程
海量用户高并发SAAS产品测试上线流程 SAAS产品测试上线流程-以Web插件产品为例子 1 概述 在互联网产品中,IT公司之间更加注重产品功能之间的协作,SAAS形态的产品扮演着越来越重要的作用 ...
- Mockito自定义verify参数Matcher
在TDD开发中,也许我们会遇见对一些重要的无返回值的行为测试,比如在用户的积分DB中增加用户的积分,这个行为对于我们的业务具有重要的价值,所以我们也希望能测试覆盖这部分业务价值.这个时候我们就得使用m ...
- [.net 面向对象程序设计进阶] (6) Lamda表达式(二) 表达式树快速入门
[.net 面向对象程序设计进阶] (6) Lamda表达式(二) 表达式树快速入门 本节导读: 认识表达式树(Expression Tree),学习使用Lambda创建表达式树,解析表达式树. 学习 ...