在面向对象设计模式中,类与类之间主要有6种关系,他们分别是:依赖、关联、聚合、组合、继承、实现。他们的耦合度(可以理解为当一个类发生变更时,对其他类造成的影响程度,影响越小则耦合度越弱,影响越大耦合度越强)依次增强。
# 依赖
依赖关系的定义为:对于两个相对独立的对象,当一个对象负责构造另一个对象的实例,或者依赖另一个对象的服务时,这两个对象之间主要体现为依赖关系。
- 依赖(Dependency)关系是类与类之间的联接,表示一个类依赖于另一个类的定义。一般而言,依赖关系在Java语言中体现为局域变量、方法的形参,或者对静态方法的调用。
# 关联
对于两个相对独立的对象,当一个对象的实例与另一个对象的一些特定实例存在固定的对应关系时,这两个对象之间为关联关系。
关联关系分为单向关联和双向关联。
* 单向关联表现为:类A当中使用了类B,其中类B是作为类A的成员变量。
* 双向关联表现为:类A当中使用了类B作为成员变量;同时类B中也使用了类A作为成员变量。
- 关联(Association)关系是类与类之间的联接,它使一个类知道另一个类的属性和方法。关联关系一般使用成员变量来实现。
注意:
- java双向关联关系代码样例会抛出java.lang.StackOverflowError(未实验)
- 在OC助攻双向关联时,注意不要引起循环导入(会编译报错的)
# 聚合
聚合关系是关联关系的一种,耦合度强于关联,他们的代码表现是相同的,仅仅是在语义上有所区别:关联关系的对象间是相互独立的,而聚合关系的对象之间存在着包容关系,他们之间是“整体-个体”的相互关系。
- 聚合(Aggregation) 是强的关联关系。聚合是整体和个体之间的关系。与关联关系一样,聚合关系也是通过实例变量实现的。但是关联关系所涉及的两个类是处在同一层次上的,而在聚合关系中,两个类是处在不平等层次上的,一个代表整体,另一个代表部分。
举例
例如:部门类与员工类,部门由员工组成,部门解散员工照样生活。
# 组合
相比于聚合,组合是一种耦合度更强的关联关系。存在组合关系的类表示“整体-部分”的关联关系. 一般来说,为了表示组合关系,常常会使用构造方法来达到初始化的目的,在初始化的时候,就将"部分"传入
- 它要求普通的聚合关系中"整体"负责"部分"的生命周期,它们之间是共生共死的,并且"部分"单独存在时没有任何意义。"整体"负责保持”部分“存活,在一些情况下将"部分"湮灭掉
- 组合关系是不能共享的,整体“可以将"部分"传递给另一个对象,由后者负责其的生命周期。换言之,"部分"在每一个时刻只能与一个对象发生组合关系,由后者排他地负责生命周期。部分和整体的生命周期一样。
举例
公司类与部门类来举例。公司由部门组成,公司破产倒闭,部门则不复存在,没有部门存在,公司也没有了。
人class与灵魂类、肉体类,当人的生命周期开始时,必须同时有灵魂和肉体;当人的生命周期结束时,灵魂肉体随之消亡;无论是灵魂还是肉体,都不能单独存在,他们必须作为人的组成部分存在。
依赖与实现,就不再赘述了
关联、聚合、组合只能配合语义,结合上下文才能够判断出来,而只给出一段代码让我们判断是关联,聚合,还是组合关系,则是无法判断的。