谈谈类之间的关联关系与依赖关系(转载)

(转载自:http://www.cnblogs.com/iyangyuan/archive/2013/06/16/3138463.html

对于很多刚刚接触UML的童鞋,可能会对类之间的关联与依赖关系不太理解,今天小菜就浅薄的讲一下。

这块的确是有点乱,不过小菜突然找到了一个比较好的切入点,拿出来分享一下。

接触过设计模式的读者,会经常看到这样的场景:在实例化A类的时候,需要B类作为构造方法的参数,这说明A类需要持有一个B类的引用。比如代理模式、装饰模式等,都会这样做。例如Java中的IO流采用的就是装饰模式,所以我们会经常看到这样的语句:new BufferInputStream(new FileInputStream("c:\\1.db"));

这种持有引用,就是简单的关联关系。在代码中表现为:在A类中有一个成员变量,变量的类型是B类,A类中持有了B类的引用,就说明A类和B类发生了关联关系。

用UML图表示如下:

稍加说明,由于是A类持有B类的引用,因此关联是从A类中发出的(由A类引起),因此箭头要从A类指向B类。

通常情况下,这种简单的单向关联就够用了,但是关联关系主要还是应用在数据库设计中。

在数据库设计中,无论是一对一、一对多、多对多,都不是单向的。

从表的角度分析,它们均可以从任意一端确定另一端。就拿一对多来说,有了one端的主键,可以根据many端表的外键查出many端数据;有了many端外键,可以根据one端表的主键查出one端数据。

从实体类的角度分析,同样可以从任意一端确定另一端。还是拿一对多来说,one端的实体类会持有一个many端的引用集合,例如private Set<B> bs;,查询到了one端,可以直接从这个集合中读取many端;many端的实体类会持有一个one端的引用,例如private A a;,查询到了many端,可以直接从这个引用确定每一个many端的one端。

这样一来,就成了双向关联,用UML画关联关系的时候,两边都要加箭头,这样太难看,索性就都不加了。

例如部门实体类和员工实体类的关系,就可以这样表示:

由于是数据库实体类间的关联关系,因此还要加上数量关系,1代表one端,0..n代表many端,说明一个部门可以有多个员工,但一个员工只能属于一个部门,通过UML图描述了一对多。

这个才是关联关系典型的应用。

不得不提的是,关联关系还可以细分为聚合和组合(二者的具体概念读者自行搜索)。

小菜发现聚合、组合可以从另一个角度去理解。

先说说聚合,它是一种弱关联,大概意思就是整体和部分可以独立存在。如果我们换个角度,可以看成是数据库的级联操作。

就拿小组和组员来说,删除某个小组的时候,把该组的组员也删除,这显然是不科学的,因为小组和组员是一种弱关联,小组可以拥有任意一个组员,一个组员也可以去任意一个小组,这个小组不存在了,可以去另一个小组,它们没有必然的关联,可以称为聚合。

因此,我们在设计数据库的时候,往往不会设置级联删除,也就是说,删除小组时不会删除组员。

UML图表示如下:

空心菱形表示聚合,指向one端。

再说说组合,组合是一种强关联,大概意思是整体和部分不可分割,不能独立存在。同样从级联操作理解。

就拿学生和学生证来说,假如某个学生退学,不再属于这个学校,那么可以考虑将该学生信息删除,删除的时候,学生对应的学生证信息也会被删除,在此处可以加级联删除。因为学生证属于某个学生专有的信息,学生不存在了,学生证又不能让他人使用,因此是一种强关联,可以称为组合。

UML图表示如下:

最后要谈的是依赖关系。

假如A类的某个方法中,使用了B类,那么就说A类依赖于B类,它们是依赖关系。

A类的某个方法使用B类,可能是方法的参数是B类,也可能是在方法中获得了一个B类实例。但无论是哪种情况,B类在A类中都是以局部变量的形式存在的。

因此,A类中有B类型的局部变量,就说A类依赖于B类。

UML图表示如下:

虚线箭头表示依赖,箭头指向被依赖的类。

综上,有一个简单的判断原则:某个类以成员变量的形式出现在另一个类中,二者是关联关系;某个类以局部变量的形式出现在另一个类中,二者是依赖关系。

       注意:本文为了方便讲解,一直是拿类当例子,这并不是一种好的设计思维。实际开发中,为了更好的实现"开-闭原则",一般都是定义接口,依赖于接口,依赖于抽象,而不是根据具体编程,希望读者不要被小菜误导!!

小菜水平有限,就先谈到这,文章如有不当之处请见谅,欢迎与我交流!

时间: 2024-08-19 06:29:58

谈谈类之间的关联关系与依赖关系(转载)的相关文章

Java类之间的关联关系(转载)

Java类之间的关联关系 UML类图中的关系分为四种:泛化.依赖.关联.实现:关联关系又可以细化为聚合和组合.一.泛化(Generalization)泛化是父类和子类之间的关系,子类继承父类的所有结构和行为.在子类中可以增加新的结构和行为,也可以覆写父类的行为. 一般用一个带空心箭头的实线表示泛化关系,UML图如下: 泛化对应Java中继承关系,即子类继承父类中出private修饰外的所有东西(变量.方法等).示例代码: public class Animal { } public class

关联关系、依赖关系总结

一.关联关系总结: 1.对象和对象之间的连接.在Java中,关联关系的代码表现形式为一个类做为另一个类的属性类型存在.即"有"的关系:"has-a". 2.关联关系的方向:关联关系分为单向关联和双向关联 ①单向关联: A类关联B类. ②双向关联:A类关联B类,B类关联A类. 3.关联关系的多重性:①一对一关联:一个学生,只能在一个班级里学习. ②一对多关联:一个学生,可以参加多个班级学习. ③解决一对多的关联的方案:集合和数组. 集合 例: public class

iOS学习连载二之OC类和类之间的关联关系

类和类直接按存在多重关系,比如继承关系.关联关系:继承关系通俗的讲即什么是什么,关联关系即什么有什么:比如:继承关系:父亲和孩子之间的基因继承关系:关联关系:老师和学生之间的关联关系.下面讲一个例子,是汽车.引擎和车灯之间的关联关系. 首先,先写除了main类的其他类,包括.h文件和.m文件 lam.h代码: // //  Lamp.h //  oc2_Car_Engine_Lamp_test1 // //  Created by imac on 15/7/21. //  Copyright (

关联关系与依赖关系的区别

一.语义上: 关联关系: A has a(knows a) B 依赖关系: A uses a B 二.代码上: 关联关系: package facade; /** * @author Administrator * @version 1.0 * @created 11-十月-2015 18:42:05 */public class A { public B m_B; public A(){ } public void finalize() throws Throwable { } } 依赖关系:

类型转换,类与类之间的转换,继承关系,继承与静态变量,子类父类重名,多继承,虚基类

 常量的基本类型转换,例如:int num(10.8),这种方式是隐式转换. 通过函数的构造函数实现转换. 类类转换函数,当构造函数不能将类型转换成基本类型时.所以就有了类类转换函数,通过这种方式. 案例: #include <iostream> class fushu { public: //通过加explicit的这种方式避免隐式转换,避免引发歧义 explicit fushu(int num) { x = num; y = num; } void print() { std::cou

搞不清FastCgi与PHP-fpm之间是个什么样的关系(转载)

刚开始对这个问题我也挺纠结的,看了<HTTP权威指南>后,感觉清晰了不少. 首先,CGI是干嘛的?CGI是为了保证web server传递过来的数据是标准格式的,方便CGI程序的编写者. web server(比如说nginx)只是内容的分发者.比如,如果请求/index.html,那么web server会去文件系统中找到这个文件,发送给浏览器,这里分发的是静态数据.好了,如果现在请求的是/index.php,根据配置文件,nginx知道这个不是静态文件,需要去找PHP解析器来处理,那么他会

关联关系:依赖、关联、聚合和组合之间区别

在学习面向对象设计对象关系时,依赖.关联.聚合和组合这四种关系之间区别比较容易混淆.特别是后三种,仅仅是在语义上有所区别,所谓语义就是指上下文环境.特定情景等.他们在编程语言中的体现却是基本相同的,但是基本相同并不等于完全相同,这一点在我的前一篇博文<设计模式中类的关系>中已经有所提及,下面就来详细的论述一下在java中如何准确的体现依赖.关联.聚合和组合. 首先看一看书上对这四种关系的定义: 依赖(Dependency)关系是类与类之间的联接.依赖关系表示一个类依赖于另一个类的定义.例如,一

【47】java的类之间的关系:泛化、依赖、关联、实现、聚合、组合

java的类之间的关系:泛化.依赖.关联.实现.聚合.组合 泛化: ? 泛化关系(Generalization)也就是继承关系,也称为"is-a-kind-of"关系,泛化关系用于描述父类与子类之间的关系,父类又称作基类或超类,子类又称作派生类.在UML中,泛 化关系用带空心三角形的直线来表示. ? 在代码实现时,使用面向对象的继承机制来实现泛化关系,如在Java语言中使用extends关键字.在C++/C#中使用冒号":"来实现. 泛化对应Java中继承关系,即子

UML 类与类之间的四大关系的一些图标及代码含义

UML 类与类之间的四大关系的一些图标及代码含义 另一个版本: 关联:连接模型元素及链接实例,用一条实线来表示: 依赖:表示一个元素以某种方式依赖于另一个元素,用一条虚线加箭头来表示: 聚合:表示整体与部分的关系,用一条实线加空心菱形来表示: 组成:表示整体与部分的有一关系,用一条实线加实心菱形来表示: 泛化(继承):表示一般与特殊的关系,用一条实线加空心箭头来表示: 实现:表示类与接口的关系,用一条虚线加空心箭头来表示:类与类之间存在以下关系:(1)泛化(Generalization)(2)关