当前位置: 首页 > news >正文

UML类图小结

这篇文章也不错 http://technoboy.iteye.com/blog/998458

================闲扯的话======================

其实我一直觉得UML是个很没啥用的东西,从来也没怎么学过。偶尔看看别人画的UML图足矣了。戏剧性的是,我见过UML最多的公司(其实也是唯一的公司),是在我从业生涯里迄今为止遇到过的最烂最sb的公司,整个开发流程都要基于UML来搞,最后项目一团乱草。当然我并不是说UML本身不好。啥东西用好了都是好东西,但是对于UML来说,我觉得如果用的人或者组织本身水平不行,还非要装b用这玩意,只能更烂更sb。

现在来说我更觉得UML像是一门已经被淘汰的技术。。。至少不像是前几年这么受推崇了。不过UML图还是要看得懂的。这也是本文最主要的目的。总结一下怎么看UML。

本文图是自己画的,文字很多来自于之前摘抄的内容。

=================正文=======================

UML的类图首先是用来描述一个类。类用一个方框表示,方框隔成几栏。

属性在上,方法在下。名称在左,类型(返回值类型)在后。抽象类抽象方法是用“斜体”

2011033015405289.png

可见性的符号表示:+public,-private,#protected,~package。


关系

类其实很简单,重要的是类与类之间的关系。

UML把类之间的关系分为以下5种.

   ● 关联:类A与类B的实例之间存在特定的对应关系(具体看下面)——    <——<>     <——<|>
   ● 依赖:类A访问类B提供的服务                     ----->
   ● 聚集:类A为整体类,类B为局部类,类A的对象由类B的对象组合而成
   ● 泛化:类A继承类B
   ● 实现:类A实现了B接口  

关联依赖和聚集含义不同,需要根据具体的业务逻辑来判断两者到底是什么关系。三者的强弱关系是聚集>关联>依赖。依赖是最弱的关系。也就是说,如果A与B关联,那么A与B肯定依赖。聚集比较复杂,也比较好和另外两种关系区分。而关联强调的是两者之间的对应关系,也就是说,如果A关联B,那么A的对象是使用到某一个B,而不是任何一个B,也就是说A的对象和B的对象两者之间是关联的。所以一般来说A如果关联B,A对象需要保存一个B对象的引用。比如Person和IDCard,就是关联关系,Person对象应该有一个指向IDCard对象的引用,不可能是任何一个IDCard都行。依赖则比关联关系要弱,仅仅表示A用到B,用到哪个B无所谓。比如System.out.println(String str)方法,依赖于String,但是并不依赖于某一个具体的String,这就是依赖关系。

关联(Association)
   关联指的是类之间的特定对应关系,在UML中用带实线的箭头表示。

按照类之间的数量对比,关联
可以分为以下三种:
   ● 一对一关联

2011033020235536.png
   ● 一对多关联

2011033020264973.png


   ● 多对多关联

2011033020260763.png
注意:关联还要以分为单向关联和双向关联


依赖(Dependency)
   依赖指的是类之间的调用关系,在UML中用带虚线的箭头表示。如果类A访问类B的属性或者方法,或者类A负责实例化类B,那么可以说类A依赖类B。和关联关系不同,无须在类A中定义类B类型的属性。依赖是UML中很弱的一种关系,非常的普遍,哪个类补得用到十几二十个别的类呀,如果递归的算下去,依赖这个关系多了去了。

2011033022275237.png


聚集(Aggregation)

 聚集是一种比组合更紧密的关系。组合是指两个类之间的对应关系。而聚集则是指这两个类被规划到了一个系统中,有着更紧密的聚合关系。

比如Person和EmployCard。如果系统需要定义一种Employ类型。那么在这个系统中,这个类型就聚集了Person和EmployCard.

2011033023054994.png

或者以一个空箭头指向前面,如图

2011033023065321.png

聚集指的是整体与部分之间的关系,在UML中用带实线的菱形箭头表示。
聚集关系还可以分为两种类型:
   ● 被聚集的子系统允许被拆卸和替换,这是普通聚集关系。
   ● 被聚集的子系统不允许被拆卸和替换,这种聚集称为强聚集关系,或者组成关系。
    注:强聚集(组成)可用带实线的实心菱形箭头表示。

2011033023164793.png
泛化(Generalization)
   泛化指的是类之间的继承关系,在UML中用带实线的三角形箭头表示。  

2011033015470949.png
实现(Realization)
   实现指的是类与接口之间的关系,在UML中用带虚线的三角形箭头表示。
2011033015491654.png

==========================其它=================================
那依赖和聚合\组合、关联等有什么不同呢?关联是类之间的一种关系,例如老师教学生,老公和老婆,水壶装水等就是一种关系。这种关系是非常明显的,在问题领域中通过分析直接就能得出。依赖是一种弱关联,只要一个类用到另一个类,但是和另一个类的关系不是太明显的时候(可以说是“uses”了那个类),就可以把这种关系看成是依赖,依赖也可说是一种偶然的关系,而不是必然的关系,就是“我在某个方法中偶然用到了它,但在现实中我和它并没多大关系”。例如我和锤子,我和锤子本来是没关系的,但在有一次要钉钉子的时候,我用到了它,这就是一种依赖,依赖锤子完成钉钉子这件事情。组合是一种整体-部分的关系,在问题域中这种关系很明显,直接分析就可以得出的。例如轮胎是车的一部分,树叶是树的一部分,手脚是身体的一部分这种的关系,非常明显的整体-部分关系。上述的几种关系(关联、聚合/组合、依赖)在代码中可能以指针、引用、值等的方式在另一个类中出现,不拘于形式,但在逻辑上他们就有以上的区别。这里还要说明一下,所谓的这些关系只是在某个问题域才有效,离开了这个问题域,可能这些关系就不成立了,例如可能在某个问题域中,我是一个木匠,需要拿着锤子去干活,可能整个问题的描述就是我拿着锤子怎么钉桌子,钉椅子,钉柜子;既然整个问题就是描述这个,我和锤子就不仅是偶然的依赖关系了,我和锤子的关系变得非常的紧密,可能就上升为组合关系(让我突然想起武侠小说的剑不离身,剑亡人亡...)。这个例子可能有点荒谬,但也是为了说明一个道理,就是关系和类一样,它们都是在一个问题领域中才成立的,离开了这个问题域,他们可能就不复存在了。


依赖和关联的区别:
①     从类的属性是否增加的角度看:发生依赖关系的两个类都不会增加属性。其中的一个类作为另一个类的方法的参数或者返回值,或者是某个方法的变量而已。发生关联关系的两个类,其中的一个类成为另一个类的属性,而属性是一种更为紧密的耦合,更为长久的持有关系。②     从关系的生命期角度看:依赖关系是仅当类的方法被调用时而产生,伴随着方法的结束而结束了。关联关系是当类实例化的时候即产生,当类销毁的时候,关系结束。相比依赖讲,关联关系的生存期更长。

组合和聚合
简单来看组合与聚合A和B,如果A组合B,那么B的生命周期与A绑定,或者说是由A控制的
聚合:


  
public A{
B b;
pubic A(B b){
// 重要:b是传进来的,不是A创建的。
this .b = b; }
}


组合


  
public A{
B b;
pubic A(){
// 重要:b是A创建的。
b = new B();
}
}

转载于:https://www.cnblogs.com/deepnighttwo/archive/2011/03/30/2000162.html

相关文章:

  • 系统动力学软件vensim之指数增长
  • 系统动力学软件vensim学习之一阶负反馈
  • 数字水印学习教程
  • Nature Science 2010-2011年全部期刊下载链接
  • QTE安装汉化添加新程序全过程
  • 努力我可以
  • linux 与 虚拟机共享数据
  • GNU make指南
  • Linux扩展swap分区大小
  • 实现了回写功能---报表工具功能之一
  • 分析两种实现多线程的方式:Thread类和Runnable接口
  • 直接来我的私人博客吧
  • Ado.Net读取Excel常见问题总结
  • 某店铺收银系统开发总结
  • (转)项目管理杂谈-我所期望的新人
  • [deviceone开发]-do_Webview的基本示例
  • 【编码】-360实习笔试编程题(二)-2016.03.29
  • es的写入过程
  • GDB 调试 Mysql 实战(三)优先队列排序算法中的行记录长度统计是怎么来的(上)...
  • gf框架之分页模块(五) - 自定义分页
  • javascript 哈希表
  • OSS Web直传 (文件图片)
  • python3 使用 asyncio 代替线程
  • Twitter赢在开放,三年创造奇迹
  • UMLCHINA 首席专家潘加宇鼎力推荐
  • vue和cordova项目整合打包,并实现vue调用android的相机的demo
  • Windows Containers 大冒险: 容器网络
  • 开源中国专访:Chameleon原理首发,其它跨多端统一框架都是假的?
  • 理清楚Vue的结构
  • 微信小程序:实现悬浮返回和分享按钮
  • 一道闭包题引发的思考
  •  一套莫尔斯电报听写、翻译系统
  • 用Node EJS写一个爬虫脚本每天定时给心爱的她发一封暖心邮件
  • Semaphore
  • 智能情侣枕Pillow Talk,倾听彼此的心跳
  • ​软考-高级-信息系统项目管理师教程 第四版【第14章-项目沟通管理-思维导图】​
  • # Pytorch 中可以直接调用的Loss Functions总结:
  • #{} 和 ${}区别
  • #{}和${}的区别?
  • #《AI中文版》V3 第 1 章 概述
  • #LLM入门|Prompt#1.7_文本拓展_Expanding
  • %@ page import=%的用法
  • (LeetCode C++)盛最多水的容器
  • (Oracle)SQL优化技巧(一):分页查询
  • (附源码)计算机毕业设计ssm基于Internet快递柜管理系统
  • (过滤器)Filter和(监听器)listener
  • (企业 / 公司项目)前端使用pingyin-pro将汉字转成拼音
  • (三)Honghu Cloud云架构一定时调度平台
  • (十五)使用Nexus创建Maven私服
  • (学习日记)2024.01.19
  • (原創) 博客園正式支援VHDL語法著色功能 (SOC) (VHDL)
  • (原創) 物件導向與老子思想 (OO)
  • ./configure,make,make install的作用
  • .net core开源商城系统源码,支持可视化布局小程序
  • .NetCore实践篇:分布式监控Zipkin持久化之殇