聚合和组合的区别以及代码实现

一、定义上区别:

聚合与组合都是表示整体和个体的关联关系,他们之间最大的区别在于子类被父类控制的程度。组合的父子类关系比聚合要强

聚合:has-a关系,父类包含子类,子类可以独立于父类存在

聚合关系用下图符号表示:表示B由A聚合而成

 

 

组合:part-of关系,父类拥有子类,子类不能独立于父类存在

组合关系用下图符号表示:表示B由A组合而成

 

 

(不过,一个关联关系是聚合还是组合,需要根据实际的业务需求来断定。为什么这么说,因为可能相同超类和子类,在不同的业务场景,关联关系会发生变化。)

举例说明:   有三个类Name,Student,Address,反应的是学生与姓名和地址之间的关系,若类的使用方法如下,则代表Name和Address与Student之间是一个聚合关系.因为此时Name和Address类在Student类中出现都是以一种地址的形式,这两种对并没有在Student类中开辟新的空间,而是将已有的对象地址传给了Student类的属性。那么当外面的name和address对象的属性值发生改变的时候,那么Student类中的属性值会自动的发生改变。

 public  class Name{                                            public class Student {                                                                                       public  class Address{  

                                                                                  private Name name;

                                                                                  private Address address;

                                                                                 public Student(Name name,Address address){         

                                                                                this.name = name;

                                                                                this.address = address;

                                                                                      }

}                                                                              }                                                                                                                                  }

若是Student类以下面的方式使用Name和Address类,那么他们之间就是一种组合的关系,因为我们可以在下面的代码中看到,在Student类中Name和Address开辟新的空间,有了自己独立的空间和属性值,此时传给Student类中属性的值不是一个地址,而是一个独立的对象,这个对象和外面name,address没有任何关系,出了属性值一样以外,外面对象值的改变不会对Student中name和address对象属性只有任何的影响。

 public  class Name{                                            public class Student {                                                                                       public  class Address{  

                                                                                  private Name name;

                                                                                  private Address address;

                                                                                 public Student(Name name,Address address){         

                                                                                this.name = new Name(name);

                                                                                this.address = new Address(address);

                                                                                      }

}                                                                              }                                                                                                                                  }

二、代码验证

 在我上传的文件中有聚合和组合的源代码文件。

posted @ 2019-11-12 16:39  不要连我的wifi  阅读(3247)  评论(0编辑  收藏  举报