类间关系有很多种 UML
快速总结:
详情:
类间关系有很多种,在大的类别上可以分为两种:纵向关系、横向关系。
纵向关系就是继承关系
泛化(generalization):
实现(realization) :
横向关系较为微妙,按照UML的建议大体上可以分为四种:
- 依赖 (Dependency)
- 关联 (Association)
- 聚合 (Aggregation)
- 组合 (Composition)
它们的强弱关系是没有异议的:依赖 < 关联 < 聚合 < 组合
然而它们四个之间的差别却又不那么好拿捏,需要好好体会。
- 依赖:
- UML表示法:虚线 + 箭头
- 关系:" ... uses a ..."
- 此关系最为简单,也最好理解,所谓依赖就是某个对象的功能依赖于另外的某个对象,而被依赖的对象只是作为一种工具在使用,而并不持有对它的引用。
- 典型的例子很多,比如:
class Human
{
public void breath()
{
Air freshAir = new Air();
freshAir.releasePower();
}
public static void main()
{
Human me = new Human();
while(true)
{
me.breath();
}
}
}class Air
{
public void releasePower()
{
//do sth.
}
}
- 释义:一个人自创生就需要不停的呼吸,而人的呼吸功能之所以能维持生命就在于吸进来的气体发挥了作用,所以说空气只不过是人类的一个工具,而人并不持有对它的引用。
- UML表示法:虚线 + 箭头
- 关联:
- UML表示法:实线 + 箭头
- 关系:" ... has a ..."
- 所谓关联就是某个对象会长期的持有另一个对象的引用,而二者的关联往往也是相互的。关联的两个对象彼此间没有任何强制性的约束,只要二者同意,可以随时解除关系或是进行关联,它们在生命期问题上没有任何约定。被关联的对象还可以再被别的对象关联,所以关联是可以共享的。
- 典型的例子很多,比如:
class Human
{
ArrayList friends = new ArrayList();
public void makeFriend(Human human)
{
friends.add(human);
}
public static void main()
{
Human me = new Human();
while(true)
{
me.makeFriend(mySchool.getStudent());
}
}
}
- 释义:人从生至死都在不断的交朋友,然而没有理由认为朋友的生死与我的生死有必然的联系,故他们的生命期没有关联,我的朋友又可以是别人的朋友,所以朋友可以共享。
- UML表示法:实线 + 箭头
- 聚合:
- UML表示法:空心菱形 + 实线 + 箭头
- 关系:" ... owns a ..."
- 聚合是强版本的关联。它暗含着一种所属关系以及生命期关系。被聚合的对象还可以再被别的对象关联,所以被聚合对象是可以共享的。虽然是共享的,聚合代表的是一种更亲密的关系。
- 典型的例子很多,比如:
class Human
{
Home myHome;
public void goHome()
{
//在回家的路上
myHome.openDoor();
//看电视
}
public static void main()
{
Human me = new Human();
while(true)
{
//上学
//吃饭
me.goHome();
}
}
}
- 释义:我的家和我之间具有着一种强烈的所属关系,我的家是可以分享的,而这里的分享又可以有两种。其一是聚合间的分享,这正如你和你媳妇儿都对这个家有着同样的强烈关联;其二是聚合与关联的分享,如果你的朋友来家里吃个便饭,估计你不会给他配一把钥匙。
- UML表示法:空心菱形 + 实线 + 箭头
- 组合:
- UML表示法:实心菱形 + 实线 + 箭头
- 关系:" ... is a part of ..."
- 组合是关系当中的最强版本,它直接要求包含对象对被包含对象的拥有以及包含对象与被包含对象生命期的关系。被包含的对象还可以再被别的对象关联,所以被包含对象是可以共享的,然而绝不存在两个包含对象对同一个被包含对象的共享。
- 典型的例子很多,比如:
class Human
{
Heart myHeart = new Heart();
public static void main()
{
Human me = new Human();
while(true)
{
myHeart.beat();
}
}
}
- 释义:组合关系就是整体与部分的关系,部分属于整体,整体不存在,部分一定不存在,然而部分不存在整体是可以存在的,说的更明确一些就是部分必须创生于整体创生之后,而销毁于整体销毁之前。部分在这个生命期内可以被其它对象关联甚至聚合,但有一点必须注意,一旦部分所属于的整体销毁了,那么与之关联的对象中的引用就会成为空引用,这一点可以利用程序来保障。心脏的生命期与人的生命期是一致的,如果换个部分就不那么一定,比如阑尾,很多人在创生后的某个时间对其厌倦便提前销毁了它,可它和人类的关系不可辩驳的属于组合。
在UML中存在一种特例,就是允许被包含对象在包含对象销毁前转移给新的对象,这虽然不自然,但它给需要心脏移植的患者带来了福音。 - 参考: https://blog.csdn.net/chenchong_219/article/details/14108651
- http://www.cnblogs.com/blog-lxf/p/5148440.html
- UML表示法:实心菱形 + 实线 + 箭头
转载于:https://www.cnblogs.com/liuguoyao514257665/p/9816526.html
类间关系有很多种 UML相关推荐
- 类与类图,以及类间关系
文章目录 前言 叙述 类与类图 如何表示 类图间关系 关联关系 1.双向关联 2.单项关联 3.自关联 4.多重关联 5.聚合关系 6.组合关系 依赖关系 泛化关系 接口与实现关系 前言 叙述 类与类 ...
- 大航海家 ——OO思想的类间关系(转)
多隆云:我和韦春花的关系是很纯洁的:网易称其和迷蝶女友的关系是培训双向选择制:杨振宁言<易经>思想阻碍了中国近代科学的发展:逻辑学家论:概念间的关系有五种,即同一.包含.交叉.分离.互斥. ...
- 【图像分割】基于迭代阙值选择、最大类间差、区域生长多种算法实现图像分割含Matlab源码
1 简介 重点讨论了图像分割法中的阈值研究法,包括迭代阙值选择.最大类间差.区域生长进行了重点分析,用Matlab进行实现并给出了实验结果. 2 部分代码 function varargout = I ...
- UML类图关系(泛化 、继承、实现、依赖、关联、聚合、组合)
在UML类图中,常见的有以下几种关系: 泛化(Generalization), 实现(Realization),关联(Association),聚合(Aggregation),组合(Composit ...
- 【UML】UML类图关系(泛化 、继承、实现、依赖、关联、聚合、组合)
http://www.cnblogs.com/olvo/archive/2012/05/03/2481014.html 继承.实现.依赖.关联.聚合.组合的联系与区别 分别介绍这几种关系: 继承 指的 ...
- 【转】 UML类图关系(泛化 、继承、实现、依赖、关联、聚合、组合
目录(?)[-] 继承 实现 依赖 关联 聚合 组合 类图及类图中的关系 继承.实现.依赖.关联.聚合.组合的联系与区别 分别介绍这几种关系: 继承 指的是一个类(称为子类.子接口)继承另外的一个类( ...
- UML 之 C++类图关系全面剖析
UML的类图关系分为: 关联.聚合/组合.依赖.泛化(继承).而其中关联又分为双向关联.单向关联.自身关联:下面就让我们一起来看看这些关系究竟是什么,以及它们的区别在哪里. 1.关联 双向关联: C1 ...
- UML类图与类的关系
内容概要 UML类图介绍 类之间的关系 泛化与实现 关联 依赖 类之间的关系 泛化与实现 关联 依赖 1111 1111-1 1111-2 222 UML类间关系有泛化(Generalization) ...
- UML类图关系表示方法
本文转载: http://blog.csdn.net/fengsh998/article/details/8105631 分类: UML2012-10-24 10:18 1175人阅读 评论(0) 收 ...
最新文章
- 数据库连接字在Web.config里的用法
- okhttp配置缓存策略_网站的缓存控制策略最佳实践及注意事项
- 入行时间序列预测必读的4篇论文(附代码)
- CUD学习-查看电脑block数量与如何分配给程序
- CVPR 2021 | 港科大:如何利用闪光图像(flash image)来去除反光
- B树、B-树、B+树、B*树(转)
- SAP打印机原理、打印配置及打印操作
- Davinci DM6446开发攻略-UBOOT-2009.03移植2 nand flash的烧写
- 李备:期待移动端非线性自适应滤波器
- matlab线性串联校正,基于MATLAB串联超前校正设计.ppt
- oracle 索引问题梳理
- HTTP协议格式详解
- 如何使用SMART原则
- docker exec详解
- 如何去掉图片上的水印,四个步骤,方法超级容易又简单
- axios小记之基本用法
- C++小游戏《末日之战1:新生》1.12.31823.132
- 《Android开发艺术探索》图书勘误
- 药品市场分析怎么写?(总结归纳了20份药品报告的经验分享)
- 视频和图片的相互转换
热门文章
- Python2.7.16安装(Ubuntu16.04)
- 特征值和特征矩阵的意义和应用
- JavaScript仿淘宝智能浮动
- Android控件Gallery3D效果
- UpdatePanel 学习之 ChildrenAsTriggers
- Page.ClientScript.RegisterStartupScript() 方法与Page.ClientScript.RegisterClientScriptBlock() 方法
- win7双系统,暴力删除ubuntu后出现grub rescue解决
- (转载)—— Logistic Regression(逻辑回归)模型实现二分类和多分类
- 交换两幅图像的幅度谱和相位谱,并重构图像
- 在visualc++可以运行的程序在linux下怎么不能,Linux环境下C++只允许单个程序运行...