关系强弱
没关系 < 依赖 < 关联 < 聚合 < 组合
依赖(dependency)
可以简单的理解,就是一个类A
使用到了另一个类B,而这种使用关系是具有偶然性的、临时性的、非常弱的,但是B
类的变化会影响到A
;比如某人要过河,需要借用一条船,此时人与船之间的关系就是依赖;表现在代码层面,为类B作为参数被类A
在某个method
方法中使用。用带虚线的箭头。
关联(association)
他体现的是两个类、或者类与接口之间语义级别的一种强依赖关系,比如我和我的朋友;这种关系比依赖更强、不存在依赖关系的偶然性、关系也不是临时性的,一般是长期性的,而且双方的关系一般是平等的、关联可以是单向、双向的;表现在代码层面,为被关联类B以类属性的形式出现在关联类A
中,也可能是关联类A引用了一个类型为被关联类B的全局变量。
依赖和关联区别
我用锤子修了一下桌子,我和锤子之间就是一种依赖,我和我的同事就是一种关联。依赖是一种弱关联,只要一个类用到另一个类,但是和另一个类的关系不是太明显的时候(可以说是“uses
”了那个类),就可以把这种关系看成是依赖,依赖也可说是一种偶然的关系,而不是必然的关系。关联是类之间的一种关系,例如老师教学生,老公和老婆这种关系是非常明显的。依赖是比较陌生,关联是我们已经认识熟悉了。
聚合
聚合是关联关系的一种特例,他体现的是整体与部分、拥有的关系,即has-a
的关系,此时整体与部分之间是可分离的,他们可以具有各自的生命周期,部分可以属于多个整体对象,也可以为多个整体对象共享;比如计算机与CPU、公司与员工的关系等;表现在代码层面,和关联关系是一致的,只能从语义级别来区分。
组合
组合也是关联关系的一种特例,他体现的是一种contains-a
的关系,这种关系比聚合更强,也称为强聚合
;他同样体现整体与部分间的关系,但此时整体与部分是不可分的,整体的生命周期结束也就意味着部分的生命周期结束;比如你和你的大脑;表现在代码层面,和关联关系是一致的,只能从语义级别来区分。
聚合与组合区别
聚合与组合唯一的差别是否在于分享!聚合关系的中的部件可以与其类分享! 比如 : 计算机与cpu ,把计算机拆了,cpu可以用于另外的计算机。但是 人与脑袋,脑袋不能用其他人上(至少现在技术还达不到!)但是 肾可以用来分享!
代码举例
雁群0.gif 雁群1.gifpublic class Goose {
}
public Goose goose;
public GooseGroup(Goose goose)
{
this.goose = goose;
}
public class Goose {
}
public Wings wings;
public Goose(){
wings=new Wings();
}
网友评论