自己制作免费网站,广州三合一网站建设,wordpress系列文章,网站优化需要那些工具在学习面向对象设计对象关系时#xff0c;依赖、关联、聚合和组合这四种关系之间区别比较容易混淆。特别是后三种#xff0c;仅仅是在语义上有所区别#xff0c;所谓语义就是指上下文环境、特定情景等。他们在编程语言中的体现却是基本相同的#xff0c;但是基本相同并不等… 在学习面向对象设计对象关系时依赖、关联、聚合和组合这四种关系之间区别比较容易混淆。特别是后三种仅仅是在语义上有所区别所谓语义就是指上下文环境、特定情景等。他们在编程语言中的体现却是基本相同的但是基本相同并不等于完全相同这一点在我的前一篇博文《设计模式中类的关系》中已经有所提及下面就来详细的论述一下在Java中如何准确的体现依赖、关联、聚合和组合。 首先看一看书上对这四种关系的定义
依赖(Dependency)关系是类与类之间的联接。依赖关系表示一个类依赖于另一个类的定义。例如一个人(Person)可以买车(car)和房子(House)Person类依赖于Car类和House类的定义因为Person类引用了Car和House。与关联不同的是Person类里并没有Car和House类型的属性Car和House的实例是以参量的方式传入到buy()方法中去的。一般而言依赖关系在Java语言中体现为局域变量、方法的形参或者对静态方法的调用。关联(Association关系是类与类之间的联接它使一个类知道另一个类的属性和方法。关联可以是双向的也可以是单向的。在Java语言中关联关系一般使用成员变量来实现。 聚合(Aggregation) 关系是关联关系的一种是强的关联关系。聚合是整体和个体之间的关系。例如汽车类与引擎类、轮胎类以及其它的零件类之间的关系便整体和个体的关系。与关联关系一样聚合关系也是通过实例变量实现的。但是关联关系所涉及的两个类是处在同一层次上的而在聚合关系中两个类是处在不平等层次上的一个代表整体另一个代表部分。 组合(Composition) 关系是关联关系的一种是比聚合关系强的关系。它要求普通的聚合关系中代表整体的对象负责代表部分对象的生命周期组合关系是不能共享的。代表整体的对象需要负责保持部分对象和存活在一些情况下将负责代表部分的对象湮灭掉。代表整体的对象可以将代表部分的对象传递给另一个对象由后者负责此对象的生命周期。换言之代表部分的对象在每一个时刻只能与一个对象发生组合关系由后者排他地负责生命周期。部分和整体的生命周期一样。 ——摘自《Java面向对象编程》作者孙卫琴 以上关系的耦合度依次增强关于耦合度的概念将在以后具体讨论这里可以暂时理解为当一个类发生变更时对其他类造成的影响程度影响越小则耦合度越弱影响越大耦合度越强。由定义我们已经知道依赖关系实际上是一种比较弱的关联聚合是一种比较强的关联而组合则是一种更强的关联所以笼统的来区分的话实际上这四种关系、都是关联关系。 依赖关系比较好区分它是耦合度最弱的一种在java中表现为局域变量、方法的形参或者对静态方法的调用如下面的例子Driver类依赖于Car类Driver的三个方法分别演示了依赖关系的三种不同形式。 [java] view plaincopy class Car { public static void run(){ System.out.println(汽车在奔跑); } } class Driver { //使用形参方式发生依赖关系 public void drive1(Car car){ car.run(); } //使用局部变量发生依赖关系 public void drive2(){ Car car new Car(); car.run(); } //使用静态变量发生依赖关系 public void drive3(){ Car.run(); } } 关联关系在java中一般使用成员变量来实现有时也用方法形参的形式实现。依然使用Driver和Car的例子使用方法参数形式可以表示依赖关系也可以表示关联关系毕竟我们无法在程序中太准确的表达语义。在本例中使用成员变量表达这个意思车是我自己的车我“拥有”这个车。使用方法参数表达车不是我的我只是个司机别人给我什么车我就开什么车我使用这个车。 [java] view plaincopy class Driver { //使用成员变量形式实现关联 Car mycar; public void drive(){ mycar.run(); } ... //使用方法参数形式实现关联 public void drive(Car car){ car.run(); } } 聚合关系是是一种比较强的关联关系java中一般使用成员变量形式实现。对象之间存在着整体与部分的关系。例如上例中 [java] view plaincopy class Driver { //使用成员变量形式实现聚合关系 Car mycar; public void drive(){ mycar.run(); } } 假如给上面代码赋予如下语义车是一辆私家车是司机财产的一部分。则相同的代码即表示聚合关系了。聚合关系一般使用setter方法给成员变量赋值。 假如赋予如下语义车是司机的必须有的财产要想成为一个司机必须要先有辆车车要是没了司机也不想活了。而且司机要是不干司机了这个车就砸了别人谁也别想用。那就表示组合关系了。一般来说为了表示组合关系常常会使用构造方法来达到初始化的目的例如上例中加上一个以Car为参数的构造方法 [java] view plaincopy public Driver(Car car){ mycar car; } 所以关联、聚合、组合只能配合语义结合上下文才能够判断出来而只给出一段代码让我们判断是关联聚合还是组合关系则是无法判断的。