分类: Java
2012-12-06 14:23:38
http://lhsblog01.blog.163.com/blog/static/102004519200952755541681/
关联和泛化都是依赖关系
*****************************************************
首先,在领域模型中,只有关联。
在DCD(设计类图)中,领域模型的关联对应了:依赖,关联,聚合,组合。
领域模型中:关联表示类(类的实例)之间的关系,表示有意义的,值得关注的连接。
是持续一段时间的关系。
作用:主要加强理解,从纯概念的角度看有意义的关系,不一定会在软件中实现。
领域模型中的关联也有多重性。
DCD图中,可以根据领域模型来设计生成类之间的关联。
一般在类图中, 用关联来表示属性。(关联,聚合,组合)(当然可以用关联类来表示关联)
而用依赖来表示其余的关系(关联)。
依赖:类A依赖于类B,则B变化,会影响到A。
依赖的类型:
1:属性
2:方法调用(向B发送信息)
3:参数
4:B是接口,超类。
在UML中要画出来的依赖有(注,属性的表示用关联,不用依赖):
1:全局变量
2:局部变量
3:参数变量
4:调用静态类方法
用关联表示属性:
从领域模型中的关联对应过来可在UML中画成:关联,聚合,组合。
关联:是指类之间的一种连接,表示较弱的连接关系。
聚合,组合:都表示一种整体与部分的关系。而组合强于聚合,组合更表示了整体与部分相 同的生命周期,而聚合中的部分可以独立于整体而存在。组合中,整体与部分有相同的 生命周期。需求描述中“包含”、“组成”、“分为…部分”等词常意味着聚合,组合关系.
关联的两个对象一般是地位平等的。(你与朋友间)
而聚合组合对象间一般是地位不平等到的。(公司与员工间)
聚合关系是“has-a”关系,组合关系是“contains-a”关系
其关系强弱为 关联<聚合<组合
通俗的例子。
你和你的心脏之间是composition关系(心脏只属于自己)
你和你买的书之间是aggregation关系(书可能是别人的)
你和你的朋友之间是association关系
//**********************************************//
在C++可这样表示:
聚合:(包含有对象的指针)
Class A{}
Class b{
A* data;
}
组合:(直接是成员对象实例)
Class A{}
Class b{
A data;
}
/////////////////////////////////////////////////
关联(association)
如果几个类元的实例之间有联系,那么这几个类元之间的语义关系即关联。关联描述了系统中对象或实例之间的离散连接。
关联带有系统中各个对象之间关系的信息。当系统执行时,对象之间的连接被建立和销毁。关联关系是整个系统中使用的“胶粘剂”,如果没有它,那么只剩下不能一起工作的孤立的类。
依赖(dependency)
两个元素之间的一种关系,其中一个元素(服务者)的变化将影响另一个元素(客户),或向它(客户) 提供所需信息。它是一种组成不同模型关系的简便方法。
依赖表示两个或多个模型元素之间语义上的关系。它只将模型元素本身连接起来而不需要用一组实例来表达它的意思。它表示了这样一种情形,提供者的某些变化会要求或指示依赖关系中客户的变化。
关联和泛化都是依赖关系,但是它们有更特别的语义,故它们有自己的名字和详细的语义。我们通常用依赖这个词来指其他的关系。
依赖用一个从客户指向提供者的虚箭头表示,用一个构造型的关键字来区分它的种类
组合,关联,聚合的区别[转]
类间关系
在类图中,除了需要描述单独的类的名称、属性和操作外,我们还需要描述类之间的联系,因为没有类是单独存在的,它们通常需要和别的类协作,创造比单独工作更大的语义。在UML类图中,关系用类框之间的连线来表示,连线上和连线端头处的不同修饰符表示不同的关系。类之间的关系有继承(泛化)、关联、聚合和组合。
(1)继承:指的是一个类(称为子类)继承另外的一个类(称为基类)的功能,并增加它自己的新功能的能力,继承是类与类之间最常见的关系。类图中继承的表示方法是从子类拉出一条闭合的、单键头(或三角形)的实线指向基类。例如,图3.2给出了MFC中CObject类和菜单类CMenu的继承关系。
图3.2 类的继承
类的继承在C++中呈现为:
class B { }
class A : public B{ }
(2)关联:指的是模型元素之间的一种语义联系,是类之间的一种很弱的联系。
关联可以有方向,可以是单向关联,也可以是双向关联。可以给关联加上关联名来描述关联的作用。关联两端的类也可以以某种角色参与关联,角色可以具有多重
性,表示可以有多少个对象参与关联。可以通过关联类进一步描述关联的属性、操作以及其他信息。关联类通过一条虚线与关联连接。对于关联可以加上一些约束,
以加强关联的含义。
关联在C++中呈现为:
class A{...}
class B{ ...}
A::Function1(B &b) //或A::Function1(B b) //或A::Function1(B *b)
即一个类作为另一个类方法的参数。
(3)聚合:指的是整体与部分的关系。通常在定义一个整体类后,再去分析这个整体类的组成结构。从而找出一些组成类,该整体类和组成类之间就形成了聚合关系。例如一个航母编队包括海空母舰、驱护舰艇、舰载飞机及核动力攻击潜艇等。需求描述中“包含”、“组成”、“分为…部分”等词常意味着聚合关系。
(4)组合:也表示类之间整体和部分的关系,但是组合关系中部分和整体具有统一的生存期。一旦整体对象不存在,部分对象也将不存在。部分对象与整体对象之间具有共生死的关系。
聚合和组合的区别在于:聚合关系是“has-a”关系,组合关系是“contains-a”关系;聚合关系表示整体与部分的关系比较弱,而组合比较强;聚合关系中代表部分事物的对象与代表聚合事物的对象的生存期无关,一旦删除了聚合对象不一定就删除了代表部分事物的对象。组合中一旦删除了组合对象,同时也就删除了代表部分事物的对象。
我们用浅显的例子来说明聚合和组合的区别。“国破家亡”,国灭了,家自然也没有了,“国”和“家”显 然也是组合关系。而相反的,计算机和它的外设之间就是聚合关系,因为它们之间的关系相对松散,计算机没了,外设还可以独立存在,还可以接在别的计算机上。 在聚合关系中,部分可以独立于聚合而存在,部分的所有权也可以由几个聚合来共享,比如打印机就可以在办公室内被广大同事共用。
在C++语言中,从实现的角度讲,聚合可以表示为:
class A {...}
class B { A* a; .....}
即类B包含类A的指针;
而组合可表示为:
class A{...}
class B{ A a; ...}
即类B包含类A的对象。
准确的UML类图中用空心和实心菱形对聚合和组合进行了区分。
图3.4 聚合和组合
聚合,关联,组合 是对象之间的三种关系。从某种意义上说,继承是一种类的纵向关系,而聚合,关联,组合是对象的横向关系。
其关系强弱为 关联<聚合<组合
关联和聚合的区别主要在语义上,关联的两个对象之间一般是平等的,例如你是我的朋友,聚合则一般不是平等的, 例如一个公司包含了很多员工,其实现上是差不多的。聚合和组合的区别则在语义和实现上都有差别,组合的两个对象之间其生命期有很大的关联,被组合的对象是 在组合对象创建的同时或者创建之后创建,在组合对象销毁之前销毁。一般来说被组合对象不能脱离组合对象独立存在,而且也只能属于一个组合对象,例如一个文 档的版本,必须依赖于文档的存在,也只能属于一个文档。聚合则不一样,被聚合的对象可以属于多个聚合对象,例如一个员工可能可以属于多个公司。
我想举个通俗的例子。