UML类图细节
类图表述的是类和类之间的关系,是前期用来推演代码设计,后期用来优化代码的结构,寻找设计不合理之处。网上解释类图和类图的画法,往往表述的十分晦涩,或者例子呆板,很难具体的操作。
类图一般在详细设计过程中出现,主要用来描述系统中各个模块中类之间的关系。也就是说,看完类图之后,你要能想象出代码大体的实现。能做到这点,才能说会看类图。类的关系一般分为3种,分别是依赖、关联、继承。先上张各个关系的表示图:

依赖,维基百科的解释是类和类之间弱连接,只在某一个时间点,有调用关系。从代码实现角度来看,一般分为三种:对象作为方法参数、对象作为局部变量、调用类的静态方法。即一个类function的括号内所调用的类,与它自己都是依赖关系。因为这种关系是弱连接的,从高内聚低耦合的角度来看,这样的代码组织最优,无论是面向对象还是面向过程。
依赖中有一个特殊的现象,即相互依赖。推敲上面对依赖的解释,相互依赖可以理解为:A类的函数可以调用B类函数的局部变量,反之同样。更加普遍的学名应该是闭包。虽然和动态语言的支持力度不一样,但java的确是支持的,就是匿名内部类。这样的结构,处理回调十分有优势。换句话说:看到类图里有相互依赖的无箭头虚线,就能得出这里有回调关系。
关联则是一种强连接关系,代码上表现为将一个类的对象作为另一个类的成员变量。关联又有两种常见的关联关系:组合和聚合。这两种区别十分的明显:在类A中有成员变量类B的实例b,如果b的生命周期一直在类A之内,则表明A关联B,且是组合关系。如果类A生成了b,而且将其传到类C,则类B与A,C都是关联,且是聚合关系,因为b的生命周期不再由A单独掌握。
找一个网上的图(图(2)),意会一下其中的区别。

其实我觉得这两种情况在真正的编码的时候,是不容易混淆的,因为他们的作用完全不一样。组合的方式主要用于代码的复用,竞争对手是继承,用于类的构建。而聚合的方式主要用于类似工厂模式,生成一些符合规格的实例,填入属性,给其他的类使用,用于代码运行时。
继承,不同于关联和依赖,它是按照现有类的类型创建新的类的方式。从线条上来说分为一般化和实现。常见的我们使用一般化,而使用实现通常在强调这是一个final类。在《Java编程思想》一书中,对应该使用继承还是组合复用代码有一个经典的判断:是否需要从新类向基类进行向上转型,如果必须,则用继承,否则应该用组合。
总结下,为了使代码高内聚低耦合,这3方式,依赖优于关联优于继承。复用类方面,组合比继承更加灵活。
UML类图细节的更多相关文章
- UML类图(下):关联、聚合、组合、依赖
前言 上一篇文章UML类图(上):类.继承.实现,讲了UML类图中类.继承.实现三种关系及其在UML类图中的画法,本文将接着上文的内容,继续讲讲对象之间的其他几种关系,主要就是关联.聚合.组合.依赖, ...
- [.net 面向对象程序设计深入](1)UML——在Visual Studio 2013/2015中设计UML类图
[.net 面向对象程序设计深入](1)UML——在Visual Studio 2013/2015中设计UML类图 1.UML简介 Unified Modeling Language (UML)又称统 ...
- UML——在Visual Studio 2013/2015中设计UML类图
1.UML简介 Unified Modeling Language (UML)又称统一建模语言或标准建模语言. 简单说就是以图形方式表现模型,根据不同模型进行分类,在UML 2.0中有13种图,以下是 ...
- 转:深入浅出UML类图(具体到代码层次)
深入浅出UML类图 作者:刘伟 ,发布于:2012-11-23,来源:CSDN 在UML 2.0的13种图形中,类图是使用频率最高的UML图之一.Martin Fowler在其著作<UML ...
- intellij idea 高级用法之:集成JIRA、UML类图插件、集成SSH、集成FTP、Database管理
之前写过一篇IntelliJ IDEA 13试用手记,idea还有很多高大上的功能,易用性几乎能与vs.net媲美,反正我自从改用idea后,再也没开过eclipse,今天来看几个高级功能: 一.与J ...
- 深入浅出UML类图
原作者:http://www.uml.org.cn/oobject/201211231.asp 在UML 2.0的13种图形中,类图是使用频率最高的UML图之一.Martin Fowler在其著作&l ...
- 看懂UML类图与时序图
看懂UML类图和时序图 这里不会将UML的各种元素都提到,我只想讲讲类图中各个类之间的关系: 能看懂类图中各个类之间的线条.箭头代表什么意思后,也就足够应对 日常的工作和交流: 同时,我们应该能将类图 ...
- 设计模式——1.概述&UML类图和时序图
声明:本博客设计模式相关文章均整理和修改自网络,原文地址:图说设计模式 学习设计模式的3个层次—— 1.熟悉所有设计模式: 2.能够用代码实现: 3.运用到工作的项目中. 设计模式指导软件开发,学习设 ...
- 看懂UML类图和时序图
看懂UML类图和时序图 这里不会将UML的各种元素都提到,我只想讲讲类图中各个类之间的关系: 能看懂类图中各个类之间的线条.箭头代表什么意思后,也就足够应对 日常的工作和交流: 同时,我们应该能将类图 ...
随机推荐
- STL总结之deque
STL中deque是我们常说的双端队列,既可以从头添加元素,也可以从尾部添加元素,deque的成员函数和vector的成员函数十分相似,但是它们的内部实现却又很多不同. deque的模板声明: t ...
- spoj 1812 LCS2(SAM+DP)
[题目链接] http://www.spoj.com/problems/LCS2/en/ [题意] 求若干个串的最长公共子串. [思路] SAM+DP 先拿个串建个SAM,然后用后面的串匹配,每次将所 ...
- jsf服务器端验证用户输入
服务器端验证用户输入数据步骤 1 html页面上插入要输入数据控件 <h:inputText size="10" value="#{commodityBean.fo ...
- redis命令之lrange
LRANGE key start stop Related commands BLPOP BRPOP BRPOPLPUSH LINDEX LINSERT LLEN LPOP LPUSH LPUSHX ...
- UVa10534 - Wavio Sequence(LIS)
题目大意 给定一个长度为n的整数序列,求个最长子序列(不一定连续),使得该序列的长度为奇数2k+1,前k+1个数严格递增,后k+1个数严格递减.注意,严格递增意味着该序列中的两个相邻数不能相同.n&l ...
- POJ2429 - GCD & LCM Inverse(Miller–Rabin+Pollard's rho)
题目大意 给定两个数a,b的GCD和LCM,要求你求出a+b最小的a,b 题解 GCD(a,b)=G GCD(a/G,b/G)=1 LCM(a/G,b/G)=a/G*b/G=a*b/G^2=L/G 这 ...
- FPGA开发板
kingst.cnblogs.com 各种应用需要的接口不同: 做数字信号处理的,需要有AD/DA, 做图像处理,需要有图像接口.如果是通信的,需要有通信的接口,例如PCI/LVDS等.... 然后根 ...
- 代码修改mysql字符
为了不再显示的时候乱码,要修改数据库默认编码.以下以GBK编码页面为例进行说明: 1.修改MYSQL的配置文件:my.ini里面修改default-character-set=gbk2.代码运行时修改 ...
- Linux 下的五种 IO 模型
概念说明 用户空间与内核空间 现在操作系统都是采用虚拟存储器,那么对32位操作系统而言,它的寻址空间(虚拟存储空间)为4G(2的32次方).操作系统的核心是内核,独立于普通的应用程序,可以访问受保护的 ...
- 再看GOPATH
原本不打算介绍GOPATH,然而,总是有初学者问一些关于GOPATH的问题,因此在这里再介绍一下GOPATH GOPATH环境变量用于指定这样一些目录:除$GOROOT之外的包含Go项目源代码和二进制 ...