区分关联、依赖和聚集关系

在建立对象模型时,很容易把依赖、关联和聚集关系混淆。当对象A和对象B之间存在依赖、关联或聚集关系时,对象A都有可能调用对象B的方法,这是三种关系之间的相同之处,除此之外,它们有着不同的特征。

1.依赖关系的特征


对于两个相对独立的系统,当一个系统负责构造另一个系统的实例,或者依赖另一个系统的服务时,这两个系统之间主要体现为依赖关系,例如生产零件的机器和零件,机器负责构造零件对象。再例如充电电池和充电器,充电电池通过充电器来充电。再例如自行车Bicycle和打气筒Pump,自行车通过打气筒来充气。图1-39为Bicycle类与Pump类的类框图。



图1-39 Bicycle类与Pump类的依赖关系

Bicycle类和Pump类之间是依赖关系,在Bicycle类中无需定义Pump类型的变量。Bicycle类的定义如下:

public class Bicycle{
/** 给轮胎充气 */
public void expand(Pump pump){
pump.blow();
}
}


在现时生活中,通常不会为某一辆自行车配备专门的打气筒,而是在需要充气的时候,从附近某个修车棚里借个打气筒打气。在程序代码中,表现为Bicycle类的expand()方法有个Pump类型的参数。以下程序代码表示某辆自行车先后到两个修车棚里充气:

myBicycle.expand(pumpFromRepairShed1); //到第一个修车棚里充气
myBicycle.expand(pumpFromRepairShed2); //若干天后,到第二个修车棚里充气

2.关联关系的特征
对于两个相对独立的系统,当一个系统的实例与另一个系统的一些特定实例存在固定的对应关系时,这两个系统之间为关联关系。例如客户和订单,每个订单对应特定的客户,每个客户对应一些特定的订单;再例如公司和员工,每个公司对应一些特定的员工,每个员工对应一特定的公司;再例如自行车和主人,每辆自行车属于特定的主人,每个主人有特定的自行车,图1-40显示了主人和自行车的关联关系。而充电电池和充电器之间就不存在固定的对应关系,同样自行车和打气筒之间也不存在固定的对应关系。

图1-40 主人和自行车的关联关系


Person类与Bicycle类之间存在关联关系,这意味着在Person类中需要定义一个Bicycle类型的成员变量。以下是Person类的定义:

public class Person{
private Bicycle bicycle; //主人的自行车

public Bicycle getBicycle(){
return bicycle;
}
public void setBicycle(Bicycle bicycle){
this.bicycle=bicycle;
}
/** 骑自行车去上班 */
public void goToWork(){
bicycle.run();
}
}


在现时生活中,当你骑自行车去上班时,只要从家里推出自己的自行车就能上路了,不象给自行车打气那样,在需要打气时,还要四处去找修车棚。因此,在Person类的goToWork()方法中,调用自身的bicycle对象的run()方法。假如goToWork()方法采用以下的定义方式:

/** 骑自行车去上班 */
public void goToWork(Bicycle bicycle){
bicycle.run();
}

那就好比去上班前,还要先四处去借一辆自行车,然后才能去上班。


3.聚集关系的特征


当系统A被加入到系统B中,成为系统B的组成部分时,系统B和系统A之间为聚集关系。例如自行车和它的响铃、龙头、轮胎、钢圈以及刹车装置就是聚集关系,因为响铃是自行车的组成部分。而人和自行车不是聚集关系,因为人不是由自行车组成的,如果一定要研究人的组成,那么他应该由头、躯干和四肢等组成。由此可见,可以根据语义来区分关联关系和聚集关系。

聚集关系和关联关系的区别还表现在以下方面:

(1) 对于具有关联关系的两个对象,多数情况下,两者有独立的生命周期。比如自行车和他的主人,当自行车不存在了,它的主人依然存在;反之亦然。但在个别情况下,一方会制约另一方的生命周期。比如客户和订单,当客户不存在,它的订单也就失去存在的意义。

(2) 对于具有聚集关系(尤其是强聚集关系)的两个对象,整体对象会制约它的组成对象的生命周期。部分类的对象不能单独存在,它的生命周期依赖于整体类的对象的生命周期,当整体消失,部分也就随之消失。比如小王的自行车被偷了,那么自行车的所有组件也不存在了,除非小王事先碰巧把一些可拆卸的组件(比如车铃和坐垫)拆了下来。
不过,在用程序代码来表示关联关系和聚集关系时,两者比较相似。图1-41为自行车Bicycle与响铃Bell的聚集关系。

图1-41 自行车和响铃的聚集关系

以下例程1-6是Bicycle类的源程序。

例程1-6 Bicycle.java

public class Bicycle{
private Bell bell;

public Bell getBell(){
return bell;
}

public void setBell(Bell bell){
this.bell=bell;
}

/** 发出铃声 */
public void alert(){
bell.ring();
}
}


在Bicycle类中定义了Bell类型的成员变量,Bicycle类利用自身的bell成员变量来发出铃声,这和在Person类中定义了Bicycle类型的成员变量,Person类利用自身的bicycle成员变量去上班很相似。

转载于:https://www.cnblogs.com/cxd4321/archive/2008/12/04/1347472.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/496572.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MarkDown 语法手册

From: https://blog.csdn.net/witnessai1/article/details/52551362 From: http://www.jianshu.com/p/1e402922ee32/ 菜鸟教程:Markdown 教程:https://www.runoob.com/markdown/md-tutorial.html Markdown 语法手册:https://www.zybuluo.com…

硬件安全(1)—— SHA-1算法在FPGA上的实现-2

SHA-1算法在FPGA上的实现-2 在上一篇文章中&#xff0c;我详细介绍了SHA-1算法的计算过程。SHA-1算法主要由消息填充(Message Padding)和哈希计算(Hash Function Engine)两部分组成。消息块标准长度规定为512bits一组。消息填充在实现过程中需要区分长度不足一个消息块( < …

Mysql -uroot -p 登陆不上_mysql的登陆和退出命令格式

mysql登陆的命令格式为&#xff1a;mysql -h [hostip] -u [username] -p [password] [database]1.普通登陆mysql数据库命令格式&#xff1a;mysql -u 用户名 -p 密码&#xff0c;例如: mysql -u root -p root如果在-p后没有提供密码&#xff0c;则会在执行命令后要求用户输入密…

Java加密与解密的艺术~RSA实现

RSA 实现 /*** 2008-6-11*/ package org.zlex.chapter08_2;import java.security.Key; import java.security.KeyFactory; import java.security.KeyPair; import java.security.KeyPairGenerator; import java.security.PrivateKey; import java.security.PublicKey; import …

IBM发布未来五年五大科技预测

来源&#xff1a;人工智能和大数据未来五年五大科技预测之AI偏见&#xff1a;AI 偏见将会爆发。但只有公正的 AI 才能生存。 5年之内&#xff0c;有偏见的AI系统和算法将不断增多&#xff0c;就像早前的计算机病毒增多一样。但我们将采取相应的应对措施&#xff0c;提出新的解决…

在Linux环境下使用C语言倒转字符串,输出错误的解决办法

项目场景&#xff1a; 学习在Linux环境下的C语言编程&#xff0c;利用GDB打Breakpoint&#xff0c;逐步调试Bug 问题描述 尝试将一个字符串倒转后输出&#xff0c;发现执行文件并没有正常的将倒转后的字符串输出。 源代码&#xff1a; #include <stdio.h>int main(voi…

“机器人之夜”看猎豹跑得快还是五款机器人价格降得快?“鸿门宴”正式上演

来源&#xff1a;机器人大讲堂3 月 21 日&#xff0c;猎豹移动&#xff08;NYSE: CMCM&#xff09;联合旗下人工智能公司猎户星空在北京水立方举行“猎豹3.21机器人之夜”发布会&#xff0c;发布自主研发的猎户机器人平台Orion OS&#xff0c;并推出五款全系列机器人产品&#…

mysql sysbench_详解MySQL基准测试和sysbench工具

一、基准测试简介1、什么是基准测试数据库的基准测试是对数据库的性能指标进行定量的、可复现的、可对比的测试。基准测试与压力测试基准测试可以理解为针对系统的一种压力测试。但基准测试不关心业务逻辑&#xff0c;更加简单、直接、易于测试&#xff0c;数据可以由工具生成&…

windows 堆栈溢出简易测试代码

环境&#xff1a;windows xp sp2 vc 6.0 Code1#include <stdio.h> 2 3int fun2() 4{ 5 printf("-------------Get privilege!---------\n"); 6 getchar(); 7 return 0; 8} 910int fun1()11{12 int iRet 0;13 int *pRet &iRet;14 pRet…

数字电路中的Single-Bit跨时钟域设计

数字电路中的Single-Bit跨时钟域设计同步时钟&异步时钟的定义Metastable&#xff08;亚稳态&#xff09;Metastable的产生原因Setup / Hold Requirement的真正原因Metastable造成的问题跨时钟域同步设计跨时钟域处理目标Single-bit的Clock Domin Crossing (CDC) 电路Single…

《Nature》重磅 | 研究员利用机器学习发现近 6000 种未知病毒

作者&#xff1a;李雨晨《Nature》杂志近日发布消息称&#xff0c;研究人员利用人工智能发现了近6000种未知的病毒。这项工作是在3月15日由美国能源部(DOE)组织的一次会议上提出的&#xff0c;它展示了一种探索地球上巨大而未知的病毒多样性的新工具。从人类健康到垃圾降解&…

mysql limit to hosts matching_MySQL 用户访问限制 -- Host Match Limit

笔者前几日在做数据库迁移的时候&#xff0c;发现了一个挺有意思的小东西&#xff1a;数据库访问限制(Host Match limit),简单地翻阅了下给官方资料&#xff0c;发现这个东西应用场景其实非常广泛&#xff0c;只是我们采用了其他可能没有原生数据库带的Access Limit 功能好地方…

数字电路中的Multi-bits跨时钟域设计

数字电路中的Multi-bits跨时钟域设计跨时钟域同步设计跨时钟域处理目标Multi-bits的Clock Domin Crossing (CDC) 电路设计1-bit "Guard" 信号同步multi-bits数据其他的Multi-bits跨时钟域同步设计跨时钟域电路的仿真验证跨时钟域同步设计 跨时钟域处理目标 在跨时钟…

ACM公布2017年图灵奖,大卫·帕特森和约翰·轩尼诗获奖

来源&#xff1a;网络大数据刚刚&#xff0c;美国计算机协会(ACM)宣布 John L. Hennessy 和 David A. Patterson 荣获 2017 年图灵奖。目前这两位学者都供职于谷歌&#xff0c;前者是谷歌母公司 Alphabet 的董事会主席&#xff0c;后者任谷歌杰出工程师&#xff0c;致力于研究机…

Java加密与解密的艺术~DES实现

密钥长度与安全性成正比&#xff0c;但Java仅支持56位密钥长度&#xff0c;作为补充&#xff0c;Bouncy Castle 提供64位密钥长度支持。在此基础上配合不同填充方式&#xff08;如PKCS5Padding&#xff0c;PKCS7Padding&#xff09;&#xff0c;可显著提高加密系统的安全性。 D…

YOLOv8改进 | 主干篇 | 利用SENetV2改进网络结构 (全网首发改进)

一、本文介绍 本文给大家带来的改进机制是SENetV2&#xff0c;其是2023.11月的最新机制(所以大家想要发论文的可以在上面下点功夫)&#xff0c;其是一种通过调整卷积网络中的通道关系来提升性能的网络结构。SENet并不是一个独立的网络模型&#xff0c;而是一个可以和现有的任何…

Linux学习路线及网络编程经典书籍

linux学习资源整理&#xff1a;https://zhuanlan.zhihu.com/p/22654634 Linux初学者(学习资料)&#xff1a;https://zhuanlan.zhihu.com/p/21723250 知乎 - 你是如何学习 Linux 编程的&#xff1f;&#xff1a;https://www.zhihu.com/question/20730157 如果让你推荐一本 Linux…

在Windows 7解决GAC错误

调试一网站源代码出现下面的错误 错误 1 Could not load file or assembly Microsoft.ReportViewer.WebForms, Version8.0.0.0, Cultureneutral, PublicKeyTokenb03f5f7f11d50a3a or one of its dependencies. The system cannot find the file specified. D:\3layerhotel\WebS…

CVPR 2018 | 腾讯AI Lab入选21篇论文详解

来源:腾讯AI实验室近十年来在国际计算机视觉领域最具影响力、研究内容最全面的顶级学术会议CVPR&#xff0c;近日揭晓2018年收录论文名单&#xff0c;腾讯AI Lab共有21篇论文入选&#xff0c;位居国内企业前列&#xff0c;我们将在下文进行详解&#xff0c;欢迎交流与讨论。去年…

Java加密与解密的艺术~DESede实现

DESede 实现 /*** 2009-10-5*/ package org.zlex.chapter07_2;import java.security.Key;import javax.crypto.Cipher; import javax.crypto.KeyGenerator; import javax.crypto.SecretKey; import javax.crypto.SecretKeyFactory; import javax.crypto.spec.DESedeKeySpec;/*…