详解UML中的6大关系(关联、依赖、聚合、组合、泛化、实现)
? 转自:http://www.yongfa365.com/Item/UML-Association-Dependency-Aggregation-Composition-Realization-Generalization.html ?大话设计模式上的一个图,我用EA画出来的: UML中的6大关系相关英文及音标:
?
?
UML中的6大关系简单解释:
注意:泛化关系和实现关系又统称为一般关系; 转自:http://www.cnblogs.com/ForEverKissing/archive/2007/12/13/993818.html UML中的6大关系详细说明: 1、关联关系: 2、依赖关系: ? 3、聚合关系: 4、组合关系: 5、泛化关系: 6、实现关系: 转自:http://www.cnblogs.com/aicro/archive/2010/08/23/1806584.html UML中的6大关系参考: 你是我的玫瑰-类关系阐微? UML中关联、依赖、聚集等关系的异同 UML 类与类之间的关系 类间的关系 UML解惑:图说UML中的六大关系 大话设计模式 引用: 详解UML中的6大关系(关联、依赖、聚合、组合、泛化、实现) http://www.yongfa365.com/item/UML-Association-Dependency-Aggregation-Composition-Realization-Generalization.html ============================================================================================================== 此文为转载文章:http://zjzkiss.cnblogs.com/ ?????? 泛化关系比较好理解,就是表示类之间的继承关系。容易混淆的是依赖、关联、聚合和组合的关系。这里做一些甄别: ?????? 1、?依赖和关联的颠倒颠 ?????? 在网上查找了一下依赖和关联的区别,有说“关联本身即是一种依赖”,亦有说“依赖是一种弱关联”,其实说来说去是一档子事。依赖和关联都是说一个类用到了另一个类。其区别在于一个是使用,一个是拥有。 ??????依赖:具有某种偶然性。比如说我要过河,没有桥怎么办,我就去借来一条小船渡过去。我与小船的关系仅仅是使用(借用)的关系。表现在代码上,为依赖的类的某个方法以被依赖的类作为其参数。或者是class A 的某个方法创造了 class B 的实例抑或对class B的静态方法的调用。如果A依赖于B,那意味着B的变化可能要求A也发生变化; ?????? 这是uml图表示的依赖关系: ?
1
public?
class
?Person
{????
2????/**?划船?*/??? 3????public?void?oarage?(Boat?boat){???? 4????????boat.oarage();???? 5?}???? 6} ? 7
关联:有名的客户和订单的关系以及公司和员工的关系,都是关联关系。还有就是我和我的单车的例子,他们都是一种“拥有”的关系。表现在代码上,就是一个类包含另一个类的实例,通常表现为被关联类以类属性的形式出现在关联类的类定义中,也可以表现为关联类引用了一个类型为被关联类的全局变量。关联可以使单向的,也可以使双向的。 从网上找到的公司和员工的UML图和代码 : 公司和员工的关联关系 ?1
class
?Company
{????
?2????private?Employee?employee;???? ?3????public?Employee?getEmployee(){???? ?4????????return?employee;???? ?5????}???? ?6????void?setEmployee(Employee?employee){???? ?7????????this.employee=employee;???? ?8????}???? ?9????//公司运作???? 10????void?run(){???? 11????????employee.startWorking();???? 12????}???? 13} ?? 14
可见依赖于与关联亦有动静之别,关联的类“静态”地引用了被关联类的实例变量,而依赖的偶然性也正说明了它的动态性。 ??????2、?聚合与组合同出而异体 ??????聚合与组合其实都是关联的特例,都是整体和部分的关系。他们的区别在于聚合的两个对象之间是可分离的,他们具有各自的生命周期。而组合往往表现为一种唇齿相依的关系。 聚合:一种容纳或曰包含的关系,如同机场和飞机,汽车和轮胎的关系。其实仔细想想,前面的公司和员工的关系也有聚合的味道在里面。 组合:也可称之为强聚合,整体和部分是不可分的,整体的生命周期结束时也就是部分的生命周期到头时。很有名的就是桌子和桌子腿的关系。 ??????聚合的UML图: 组合的UML图: ? 然而,聚合与组合的代码表现形式是一样的,都可以表现为以下的形式,它们仅仅具有语义上的区别。 网上找到的电脑和CPU的关系的代码表现: ? ?1
class
?Computer
{????
private?CPU?cpu;???? ?3????public?CPU?getCPU(){???? return?cpu;???? ?6????void?setCPU(CPU?cpu){???? this.cpu=cpu;???? 开启电脑????????void?start(){???? 11????????cpu运作????12????????cpu.run();???? 13????}???? 14} ?? 15 --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 设计模式中类的关系? 在java以及其他的面向对象设计模式中,类与类之间主要有6种关系,他们分别是:依赖、关联、聚合、组合、继承、实现。他们的耦合度依次增强。 1.?依赖(Dependence)?
??????? 依赖关系的定义为:对于两个相对独立的对象,当一个对象负责构造另一个对象的实例,或者依赖另一个对象的服务时,这两个对象之间主要体现为依赖关系。定义比较晦涩难懂,但在java中的表现还是比较直观的:类A当中使用了类B,其中类B是作为类A的方法参数、方法中的局部变量、或者静态方法调用。类上面的图例中:People类依赖于Book类和Food类,Book类和Food类是作为类中方法的参数形式出现在People类中的。 代码样例:
2.关联(Association)、、 单向关联: ? 双向关联:
??????? 对于两个相对独立的对象,当一个对象的实例与另一个对象的一些特定实例存在固定的对应关系时,这两个对象之间为关联关系。关联关系分为单向关联和双向关联。在java中,单向关联表现为:类A当中使用了类B,其中类B是作为类A的成员变量。双向关联表现为:类A当中使用了类B作为成员变量;同时类B中也使用了类A作为成员变量。 代码样例: copy
3.聚合(Aggregation)
?????? ?聚合关系是关联关系的一种,耦合度强于关联,他们的代码表现是相同的,仅仅是在语义上有所区别:关联关系的对象间是相互独立的,而聚合关系的对象之间存在着包容关系,他们之间是“整体-个体”的相互关系。 代码样例: copy
4.组合(Composition)
?????? ?相比于聚合,组合是一种耦合度更强的关联关系。存在组合关系的类表示“整体-部分”的关联关系,“整体”负责“部分”的生命周期,他们之间是共生共死的;并且“部分”单独存在时没有任何意义。在下图的例子中,People与Soul、Body之间是组合关系,当人的生命周期开始时,必须同时有灵魂和肉体;当人的生命周期结束时,灵魂肉体随之消亡;无论是灵魂还是肉体,都不能单独存在,他们必须作为人的组成部分存在。 copy
5.继承(Generalization)
??????? 继承表示类与类(或者接口与接口)之间的父子关系。在java中,用关键字extends表示继承关系。UML图例中,继承关系用实线+空心箭头表示,箭头指向父类。 6.实现(Implementation)
????? ? ?表示一个类实现一个或多个接口的方法。接口定义好操作的集合,由实现类去完成接口的具体操作。在java中使用implements表示。UML图例中,实现关系用虚线+空心箭头表示,箭头指向接口。 ??????? 在java中继承使用extends关键字,实现使用implements关键字,很直观。就不代码演示了。 http://www.voidcn.com/article/p-bigcrtui-bme.html (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |