[转载]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是一种标准的 ...
随机推荐
- [转]Maven 划分模块
所有用Maven管理的真实的项目都应该是分模块的,每个模块都对应着一个pom.xml.它们之间通过继承和聚合(也称作多模块,multi-module)相互关联.那么,为什么要这么做呢?我们明明在开发一 ...
- MySql Windws 下自动备份脚本
这几天正在做一个 使用MySQL数据库的项目,目前项目已经完成了,当部署好项目之后,正在考虑如何自动备份MySql数据库的问题,我在网上找了一下资料终于解决了,特此记录一下. @echo off e ...
- ehcache基本使用
maven <dependency> <groupId>net.sf.ehcache</groupId> <artifactId>ehcache< ...
- 算法:x的n次方
该题是用来公司教学,并无难度.用于说明算法效率差异以及循环和递归的效率差别. package practice; import java.math.BigDecimal; /** * @author ...
- Json序列化之.NET开源类库Newtonsoft.Json的研究
一.Json简介 JSON(全称为JavaScript Object Notation) 是一种轻量级的数据交换格式.它是基于JavaScript语法标准的一个子集. JSON采用完全独立于语言的文 ...
- Python2.6下基于rsa的加密解密
生成公钥的私钥: # -*- coding: UTF-8 -*- import rsa import base64 (public_key, private_key) = rsa.newkeys(10 ...
- Java提高篇(三一)-----Stack
在Java中Stack类表示后进先出(LIFO)的对象堆栈.栈是一种非常常见的数据结构,它采用典型的先进后出的操作方式完成的.每一个栈都包含一个栈顶,每次出栈是将栈顶的数据取出,如下: Stack通过 ...
- 一个线上运营着3000+人的游戏,因为我不小心一个DROP DATABASE,全没了。 怎么办??跟我HOLD住!!!
前言 今天下午3点,我按照惯例,打开游戏服务器,开新服部署嘛,游戏在腾讯开放平台,简单.闭着眼睛都OK.于是一轮子的复制黏贴拷贝,把服务器加起来,然后启动查看日志. ....突然发现不断的有Excep ...
- 三天学会HTML5 之第一天
引言 HTML5 一直是非常热门的话题,因此此系列文章主要从一些基本功能开始讲起,逐步深入了解HTML5的新概念. 首先了解一些基本的术语和概念. SGML, HTML,XML三者之间的区别 Doc类 ...
- Atom
http://blog.csdn.net/crper/article/details/45647459