十年网站开发经验 + 多家企业客户 + 靠谱的建站团队
量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决
1、依赖关系,uml图示为虚线加箭头 A------B, 是一种使用的关系, 即一个类的实现需要另一个类的协助。比用常常写的工具类就是可以被 其他类使用的
创新互联是一家专业提供汤阴企业网站建设,专注与成都做网站、网站建设、HTML5、小程序制作等业务。10年已为汤阴众多企业、政府机构等服务。创新互联专业网络公司优惠进行中。
代码示例: 为订单生成订单号码的服务类,使用Math类产生随机数
这个时候 OrderService类依赖Math类
OrderService ------ Math
public class OrderService{
public String getOrderNum(){
return Math.random()*1000+"";
}
}
2、关联关系,分为聚合、组合、及一般关联 。
组合关系 A◆———B 部分和整体之间具有相同的生命周期,当整体消亡后,部分也将消亡。举例 人体结构中 人体和大脑之间是一种组合关系, 人体亡了大脑也会死 例子有点沉重哈,但是好理解
代码示例
Body ◆———Brain
public class Body{
private Brain brain;
public Body(){
this.brain = new Brain();
}
public void think(){
brain.think();
}
}
聚合关系 A◇———B 部分与整体之间并没有相同的生命周期,整体消亡后部分可以独立存在。 比如汽车和轮胎, 汽车销毁了 轮胎可以作为配件 运用到其他汽车上,所以是一种聚合关系。
代码示例:
Car ◆———Tyre
public class Car{
private Tyre tyre;
public Car(Tyre tyre){
this.tyre= tyre;
}
public void run(){
tyre.run();
}
}
一般关联:是一种结构化的关系,指一种对象和另一种对象有联系,给定关联的两个类,可以从其中的一个类的对象访问到另一个类的相关对象。
解释上很拗口 不如组合 聚合来的清晰明了。可以和依赖关系作个对比,依赖实际上就是 主类依赖其他类的方法 完成部分逻辑,比如工具类的调用等, 但是两个类之间没有任何联系。 而关联关系 是存在某种联系的 比如学校和老师,老师和学生,学生和课本 等等, 两个对象之间是存在某种联系的。
java示例:
Student ———— Teacher
public class Student{
private Teacher englishTeacher;
public String myEnglishTeacherName(){
return englishTeacher.getName();
}
}
上面的关联关系,只是描述了 对象和对象之间的联系,并没有指明关联的数量。 比如一个学生是关联多个老师的(语文老师、数学老师 etc) ,那么这种关联是一种1对多的关联 等等,先理解基本的然后再深入比较好
从类的代码表达来看, 关联关系(组合、聚合、一般关联关系) 都是一个类作为另一个类的成员变量来表示, 依赖关系大部分是 一个类作为另一个类的方法参数,或者直接调用被依赖类的静态方法, 或者直接实例化被依赖类然后调用其方法 等。
理解好了 依赖和关联 包括集成 实现 等关系及 UML图示后, 对于 代码的设计将会有很大帮助
聚合和组合的区别在于:聚合关系是“has-a”关系,组合关系是“contains-a”关系;聚合关系表示整体与部分的关系比较弱,而组合比较强;聚合关系中代表部分事物的对象与代表聚合事物的对象的生存期无关,一旦删除了聚合对象不一定就删除了代表部分事物的对象。组合中一旦删除了组合对象,同时也就删除了代表部分事物的对象。
我们用浅显的例子来说明聚合和组合的区别。“国破家亡”,国灭了,家自然也没有了,“国”和“家”显然也是组合关系。而相反的,计算机和它的外设之间就是聚合关系,因为它们之间的关系相对松散,计算机没了,外设还可以独立存在,还可以接在别的计算机上。在聚合关系中,部分可以独立于聚合而存在,部分的所有权也可以由几个聚合来共享,比如打印机就可以在办公室内被广大同事共用。
聚合则一般不是平等的,例如一个公司包含了很多员工,其实现上是差不多的。聚合和组合的区别则在语义和实现上都有差别,组合的两个对象之间其生命期有很大的关联,被组合的对象是在组合对象创建的同时或者创建之后创建,在组合对象销毁之前销毁。一般来说被组合对象不能脱离组合对象独立存在,而且也只能属于一个组合对象,例如一个文档的版本,必须依赖于文档的存在,也只能属于一个文档。聚合则不一样,被聚合的对象可以属于多个聚合对象,例如一个员工可能可以属于多个公司。
//依赖最常见的是参数关系,如:
public class B{
/***B中的一个方法**/
public void testMethod(A a){
//此时B和A是依赖关系
}
}
//聚合关系通常表现为部分与整体的关系,如:
public class B{
/***B中的一个属性**/
A a;
}
//泛化关系通常表现为继承关系,如:
public class B extends A{
}
聚合(Aggregation) 关系是关联关系的一种,是强的关联关系。聚合是整体和个体之间的关系。例如,汽车类与引擎类、轮胎类,以及其它的零件类之间的关系便整体和个体的关系。与关联关系一样,聚合关系也是通过实例变量实现的。但是关联关系所涉及的两个类是处在同一层次上的,而在聚合关系中,两个类是处在不平等层次上的,一个代表整体,另一个代表部分。
组合(Composition) 关系是关联关系的一种,是比聚合关系强的关系。它要求普通的聚合关系中代表整体的对象负责代表部分对象的生命周期,组合关系是不能共享的。代表整体的对象需要负责保持部分对象和存活,在一些情况下将负责代表部分的对象湮灭掉。代表整体的对象可以将代表部分的对象传递给另一个对象,由后者负责此对象的生命周期。换言之,代表部分的对象在每一个时刻只能与一个对象发生组合关系,由后者排他地负责生命周期。部分和整体的生命周期一样。
class Driver {
//使用成员变量形式实现关联
Car mycar;
public void drive(){
mycar.run();
}
...
//使用方法参数形式实现关联
public void drive(Car car){
car.run();
}
}
聚合关系是是一种比较强的关联关系,java中一般使用成员变量形式实现。对象之间存在着整体与部分的关系。例如上例中
class Driver {
//使用成员变量形式实现聚合关系
Car mycar;
public void drive(){
mycar.run();
}
}
假如给上面代码赋予如下语义:车是一辆私家车,是司机财产的一部分。则相同的代码即表示聚合关系了。聚合关系一般使用setter方法给成员变量赋值。
假如赋予如下语义:车是司机的必须有的财产,要想成为一个司机必须要先有辆车,车要是没了,司机也不想活了。而且司机要是不干司机了,这个车就砸了,别人谁也别想用。那就表示组合关系了。一般来说,为了表示组合关系,常常会使用构造方法来达到初始化的目的,例如上例中,加上一个以Car为参数的构造方法
public Driver(Car car){
mycar = car;
}
所以,关联、聚合、组合只能配合语义,结合上下文才能够判断出来,而只给出一段代码让我们判断是关联,聚合,还是组合关系,则是无法判断的。