我知道聚合和组合之间的概念差异。有人能用实例告诉我它们之间在Java中的实现区别吗?
一个简单的合成程序
public class Person {
private double salary;
private String name;
private Birthday bday;
public Person(int y,int m,int d,String name){
bday=new Birthday(y, m, d);
this.name=name;
}
public double getSalary() {
return salary;
}
public String getName() {
return name;
}
public Birthday getBday() {
return bday;
}
///////////////////////////////inner class///////////////////////
private class Birthday{
int year,month,day;
public Birthday(int y,int m,int d){
year=y;
month=m;
day=d;
}
public String toString(){
return String.format("%s-%s-%s", year,month,day);
}
}
//////////////////////////////////////////////////////////////////
}
public class CompositionTst {
public static void main(String[] args) {
// TODO code application logic here
Person person=new Person(2001, 11, 29, "Thilina");
System.out.println("Name : "+person.getName());
System.out.println("Birthday : "+person.getBday());
//The below object cannot be created. A bithday cannot exixts without a Person
//Birthday bday=new Birthday(1988,11,10);
}
}
我会使用一个很好的 UML 示例。
以一所大学为例,它有1至20个不同的系,每个系有1至5名教授。一所大学和它的院系之间有一个组成联系。一个系和它的教授之间有一种聚合联系。
组成只是一个强大的聚合,如果大学被摧毁,那么部门也应该被摧毁。但是,即使教授们各自的系消失了,我们也不应该杀死他们。
在java中:
public class University {
private List<Department> departments;
public void destroy(){
//it's composition, when I destroy a university I also destroy the departments. they cant live outside my university instance
if(departments!=null)
for(Department d : departments) d.destroy();
departments.clean();
departments = null;
}
}
public class Department {
private List<Professor> professors;
private University university;
Department(University univ){
this.university = univ;
//check here univ not null throw whatever depending on your needs
}
public void destroy(){
//It's aggregation here, we just tell the professor they are fired but they can still keep living
for(Professor p:professors)
p.fire(this);
professors.clean();
professors = null;
}
}
public class Professor {
private String name;
private List<Department> attachedDepartments;
public void destroy(){
}
public void fire(Department d){
attachedDepartments.remove(d);
}
}
围绕这个的东西。
编辑:要求的示例
public class Test
{
public static void main(String[] args)
{
University university = new University();
//the department only exists in the university
Department dep = university.createDepartment();
// the professor exists outside the university
Professor prof = new Professor("Raoul");
System.out.println(university.toString());
System.out.println(prof.toString());
dep.assign(prof);
System.out.println(university.toString());
System.out.println(prof.toString());
dep.destroy();
System.out.println(university.toString());
System.out.println(prof.toString());
}
}
大学班级
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
public class University {
private List<Department> departments = new ArrayList<>();
public Department createDepartment() {
final Department dep = new Department(this, "Math");
departments.add(dep);
return dep;
}
public void destroy() {
System.out.println("Destroying university");
//it's composition, when I destroy a university I also destroy the departments. they cant live outside my university instance
if (departments != null)
departments.forEach(Department::destroy);
departments = null;
}
@Override
public String toString() {
return "University{\n" +
"departments=\n" + departments.stream().map(Department::toString).collect(Collectors.joining("\n")) +
"\n}";
}
}
部门类
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
public class Department {
private final String name;
private List<Professor> professors = new ArrayList<>();
private final University university;
public Department(University univ, String name) {
this.university = univ;
this.name = name;
//check here univ not null throw whatever depending on your needs
}
public void assign(Professor p) {
//maybe use a Set here
System.out.println("Department hiring " + p.getName());
professors.add(p);
p.join(this);
}
public void fire(Professor p) {
//maybe use a Set here
System.out.println("Department firing " + p.getName());
professors.remove(p);
p.quit(this);
}
public void destroy() {
//It's aggregation here, we just tell the professor they are fired but they can still keep living
System.out.println("Destroying department");
professors.forEach(professor -> professor.quit(this));
professors = null;
}
@Override
public String toString() {
return professors == null
? "Department " + name + " doesn't exists anymore"
: "Department " + name + "{\n" +
"professors=" + professors.stream().map(Professor::toString).collect(Collectors.joining("\n")) +
"\n}";
}
}
教授课
import java.util.ArrayList;
import java.util.List;
public class Professor {
private final String name;
private final List<Department> attachedDepartments = new ArrayList<>();
public Professor(String name) {
this.name = name;
}
public void destroy() {
}
public void join(Department d) {
attachedDepartments.add(d);
}
public void quit(Department d) {
attachedDepartments.remove(d);
}
public String getName() {
return name;
}
@Override
public String toString() {
return "Professor " + name + " working for " + attachedDepartments.size() + " department(s)\n";
}
}
实现是有争议的,因为它取决于你需要如何处理创建,雇佣删除等。与行动无关
组成
final class Car {
private final Engine engine;
Car(EngineSpecs specs) {
engine = new Engine(specs);
}
void move() {
engine.work();
}
}
聚合
final class Car {
private Engine engine;
void setEngine(Engine engine) {
this.engine = engine;
}
void move() {
if (engine != null)
engine.work();
}
}
在合成的情况下,发动机完全由汽车封装。外部世界无法获得对引擎的引用。发动机与汽车生死攸关。通过聚合,汽车也通过引擎执行其功能,但引擎并不总是汽车的内部部件。发动机可能被更换,甚至完全拆下。不仅如此,外部世界仍然可以参考发动机,并对其进行修补,无论其是否在汽车中。
任何人都可以给出代码示例来显示聚合和组合之间的区别。我已经阅读了这篇文章,但不明白它们在代码上有何不同。 请通过代码显示差异。
因为聚合和组成是相关的关联,或者我们可以说它给出了对对象或其他任何东西之间关系的理解。 我发布这个问题是因为我在采访中问了一个问题,什么是组成和聚合。 所以根据我的理解,我给出了我的想法,如下所示。 http://www.coderanch.com/t/522414/java/java/Association-Aggregation-Composition 聚集、关联和组合 Java中的关联、聚合
假设我们有两个名为Point和Line的类。Line类有两个构造函数。这是Point类的代码。 这是Line类的代码。 如您所见,Line类有两个构造函数。第一个构造函数是组合的例子,而第二个构造函数是集合的例子。现在,关于这个案子我们能说些什么?一个类可以同时有聚合和合成吗?谢谢你的回答。
问题内容: 这个问题已经在这里有了答案 : 11年前关闭。 组合和聚合之间有什么区别?有人可以给我这个OOAD的样品吗? 问题答案: 在这里找到 “聚合和组合都是特殊的关联。聚合用于表示所有权或整体/部分关系,而组合用于表示甚至更强的所有权形式。有了组合,我们得到部分与整体的重合寿命。从创建和销毁的角度出发,复合对象对其各个部分的布置负全责。 而且,合计末端的多样性不能超过一;即,它是不共享的。一
请考虑以下情况: 我如何在类图上表示< code>A和< code>B之间的关系?如果< code>B只保存一个< code>A(而不是一个数组),我会使用组合/聚合,但是在这种情况下,我不确定应该做什么。非常感谢你的帮助!
本文向大家介绍Java中关联与聚合之间的区别,包括了Java中关联与聚合之间的区别的使用技巧和注意事项,需要的朋友参考一下 协会 就对象而言,关联是指两个相关对象之间的“具有”关系。例如,一个雇员有一个通讯地址。 聚合 就对象而言,聚合是指两个相关对象之间具有“ +”关系。例如,一个部门有多名员工。它指的是在父类中具有子对象的集合。例如: 序号 键 协会 聚合 1 定义 关联是指彼此使用的两个类之