http://www.uml.org.cn/oobject/200911174.asp
如果你确定两件对象之间是is-a的关p,那么此时你应该用承;比如菱Ş、圆形和方Ş都是形状的一U,那么他们都应该从形状cȝ承而不是聚合?br />
如果你确定两件对象之间是has-a的关p,那么此时你应该用聚合;比如?sh)脑是由昄器、CPU、硬盘等l成的,那么你应该把昄器、CPU、硬盘这些类聚合成电(sh)脑类Q而不是从?sh)脑cȝѝ?/p>
c间的关p?
|上关于此类的讨论非常多Q发现对于该问题的理解各有各的说法,而各个说法中又相ȝq。通过览q些讨论以及(qing)寏VO'Reilly
- UML 2.0 In A Nutshell (2007)》的参考,发表一下自q看法
c间关系有很多种Q在大的cd上可以分ZU:(x)U向关系、横向关pR?/p>
U向关系是l承关系Q它的概念非常明,也成为OO的三个重要特征之一Q这里不q多的讨论?/p>
横向关系较ؓ(f)微妙Q按照UML的徏议大体上可以分ؓ(f)四种Q?/p>
-
- 依赖 QDependencyQuses a
- 兌 QAssociationQhas a
- 聚合 QAggregationQowns a
- l合 QCompositionQis a part of
它们的强弱关pL没有异议的:(x)依赖 < 兌 < 聚合 < l合
然而它们四个之间的差别却又不那么好拿捏Q需要好好体?x)?/p>
- 依赖Q?
- UML表示法:(x)虚线 + 头
- 关系Q? ... uses a ..."
- 此关pL为简单,也最好理解,所谓依赖就是某个对象的功能依赖于另外的某个对象Q而被依赖的对象只是作ZU工具在使用Q而ƈ不持有对它的引用?
- 典型的例子很多,比如Q?br />
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.
}
}
- 释义Q一个h自创生就需要不停的呼吸Q而h的呼吸功能之所以能l持生命在于吸q来的气体发挥了作用Q所以说I气只不q是人类的一个工P而hq不持有对它的引用?
- 兌Q?
- UML表示法:(x)实线 + 头
- 关系Q? ... has a ..."
-
所谓关联就是某个对象会(x)长期的持有另一个对象的引用Q而二者的兌往往也是怺的。关联的两个对象彼此间没有Q何强制性的U束Q只要二者同意,可以随时?
除关pL是进行关联,它们在生命期问题上没有Q何约定。被兌的对象还可以再被别的对象兌Q所以关联是可以׃n的?
- 典型的例子很多,比如Q?br />
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());
}
}
}
- 释义Qh从生x都在不断的交朋友Q然而没有理p为朋友的生死与我的生L必然的联p,故他们的生命期没有关联,我的朋友又可以是别h的朋友,所以朋友可以共享?
- 聚合Q?nbsp;
- UML表示法:(x)I心菱Ş + 实线 + 头
- 关系Q? ... owns a ..."
- 聚合是强版本的关联。它暗含着一U所属关pM?qing)生命期关系。被聚合的对象还可以再被别的对象兌Q所以被聚合对象是可以共享的。虽然是׃n的,聚合代表的是一U更亲密的关pR?
- 典型的例子很多,比如Q?br />
class Human
{
Home myHome;
public void goHome()
{
//在回家的路上
myHome.openDoor();
//看电(sh)?br />
}
public static void main()
{
Human
me = new Human();
while(true)
{
//上学
//吃饭
me.goHome();
}
}
}
- 释义Q我的家和我之间h着一U强烈的所属关p,我的家是可以分n的,而这里的分n又可以有两种。其一是聚合间的分享,q正如你和你媛_儉K对这个家有着同样的强烈关联;其二是聚合与兌的分享,如果你的朋友来家里吃个便饭,估计你不?x)给他配一把钥匙?
- l合Q?
- UML表示法:(x)实心菱Ş + 实线 + 头
- 关系Q? ... is a part of ..."
- l合是关pd中的最强版本,它直接要求包含对象对被包含对象的拥有以及(qing)包含对象与被包含对象生命期的关系。被包含的对象还可以再被别的对象兌Q所以被包含对象是可以共享的Q然而绝不存在两个包含对象对同一个被包含对象的共享?
- 典型的例子很多,比如Q?br />
class Human
{
Heart myHeart = new Heart();
public static void main()
{
Human
me = new Human();
while(true)
{
myHeart.beat();
}
}
}
-
释义Q组合关pd是整体与部分的关p,部分属于整体Q整体不存在Q部分一定不存在Q然而部分不存在整体是可以存在的Q说的更明确一些就是部分必d生于?
体创生之后,而销毁于整体销毁之前。部分在q个生命期内可以被其它对象关联甚臌合,但有一点必L意,一旦部分所属于的整体销毁了Q那么与之关联的对象
中的引用׃(x)成ؓ(f)I引用,q一点可以利用程序来保障。心脏的生命期与人的生命期是一致的Q如果换个部分就不那么一定,比如阑尾Q很多h在创生后的某个时?
对其厌倦便提前销毁了它,可它和hcȝ关系不可辩驳的属于组合?br />
在UML中存在一U特例,是允许被包含对象在包含对象销毁前转移l新的对象,q虽然不自然Q但它给需要心脏移植的(zhn)者带来了音?
也可以这样分Q?br />
- 依赖(dependency)是一U用关p,他描qC个事物的规约变化可能影响C用它的另一个事物。个为在参数或者方法体中用到另外的类是对该cL依赖的关pRuse
a
- 泛化(dependency)用于描述子类到父cM间的关系?Is a kind of
- 兌(association)是一U结构关p,他描qC个对象与另一个对象相联系?Has a
- 双向兌(association)通过A对象可以扑ֈB对象QB对象同样可以扑ֈA对象的关联ؓ(f)双向兌?
- 单向兌(direction-association)通过A对象可以扑ֈB对象Q但通过B对象不能扑ֈA对象的关联ؓ(f)单向兌?
- 聚合(aggreation)A对象是B对象的一个组成部份,但A对象同时可能是C对象的组成部分这U关联ؓ(f)聚合?
- l合(composition)A对象是B对象的一个组成部份,除非B对象A对象转交l其他对象,否则A对象只能是B对象的组成部分,q种兌为组合?

q篇文章写的也很好,理解h比较Ҏ(gu)点:(x)
http://www.uml.org.cn/oobject/201006243.asp

]]>