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的各种元素都提到,我只想讲讲类图中各个类之间的关系: 能看懂类图中各个类之间的线条.箭头代表什么意思后,也就足够应对 日常的工作和交流: 同时,我们应该能将类图 ...
随机推荐
- ifconfig命令
许多windows非常熟悉ipconfig命令行工具,它被用来获取网络接口配置信息并对此进行修改.Linux系统拥有一个类似的工具,也就是ifconfig(interfaces config).通常需 ...
- (转)使用pth文件,让python方便的import自己写的模块
转自:http://www.elias.cn/Python/PythonPath 文章简单易懂,有理有据. 有时候我们正在修改或调试的程序会是一个库,为修改方便,我们可能不大希望把它放到 site-p ...
- JZ2440开发笔记(1)——arm-linux-gcc环境搭建
1 下载arm-linux-gcc-4.4.3安装包,http://arm9.net/download.asp 2 解压arm-linux-gcc-4.4.3-20100728.tar.gz,使用命令 ...
- 成功安装mysql(mysql-5.5.32-winx64.msi)后,为何服务管理器里找不到MYSQL服务名?
解决方案: 1.打开cmd,切换到mysql的bin目录下 2. D:\Program Files\MySQL5.1\bin>mysqld.exe -install 成功后会出现:Service ...
- Java笔记(十七)……异常
异常概述 异常是什么 是对问题的描述,将问题进行对象的封装 异常体系 Throwable |---Error |---Exception |---RuntimeException 异常体系的特点 异常 ...
- ubuntu下安装opencv 2.4.9 脚本,支持摄像头和cuda
arch=$(uname -m) if [ "$arch" == "i686" -o "$arch" == "i386" ...
- 【Java基础】Java接口的总结
什么是接口 接口和抽象类很相似,也是一种抽象的概念,用Interface关键字来修饰.那有了抽象类为啥还要有个接口呢,既然都是抽象的,要一个不就可以了吗?其实不是这样的,抽象类是对一类事物共性的一种抽 ...
- HW5.20
public class Solution { public static void main(String[] args) { System.out.printf("%s\t%s\t%s\ ...
- ip_conntrack缓存neighbour
在我的ip_conntrack版本中,它目前已经可以缓存路由,filter规则等,还可以平滑生效最新配置的NAT,它越来越像真正的SDN了,唯一有待完善的就是将5元组的tuple进化成N元组的tupl ...
- android113 自定义进度条
MainActivity: package com.itheima.monitor; import android.os.Bundle; import android.app.Activity; im ...