Java 应用面向对象聚合概念的正确方法
我正在修复我系统的OOP设计,因为我认为体系结构有缺陷。我必须为正确的面向对象应用程序重写类,如继承、接口和聚合/组合,以实现正确的代码重用和关系 假设我有课程班、学科班、学年班、年级班,我想将Java 应用面向对象聚合概念的正确方法,java,oop,aggregation,composition,Java,Oop,Aggregation,Composition,我正在修复我系统的OOP设计,因为我认为体系结构有缺陷。我必须为正确的面向对象应用程序重写类,如继承、接口和聚合/组合,以实现正确的代码重用和关系 假设我有课程班、学科班、学年班、年级班,我想将HAS-A(Aggregation)的概念应用为 课程HAS-A科目 课程HAS-AYear级别 课程HAS-A学年 科目HAS-A学年 受试者HAS-AYear级别 这样做是否足够: public class Curriculum { SchoolYear schoolYear = new Sc
HAS-A
(Aggregation)的概念应用为
课程HAS-A
科目
课程HAS-A
Year级别
课程HAS-A
学年
科目HAS-A
学年
受试者HAS-A
Year级别
这样做是否足够:
public class Curriculum {
SchoolYear schoolYear = new SchoolYear();
YearLevel yearLevel = new YearLevel();
}
或者使用构造函数对其进行初始化:
public class Curriculum {
SchoolYear schoolYear;
YearLevel yearLevel;
public Curriculum(SchoolYear sy, YearLevel yl ){
this.schoolYear = sy;
this.yearLevel = yl;
}
或者仅在方法中创建类的实例,如:
public DefaultListModel getAllYearLevel(){
YearLevel yl = new YearLevel();
return yl.getAllYearLevels();
}
我不认为这是正确的,因为我不认为重新创建同样的方法有什么意义,只是说课程类有-A
YearLevel
考虑到课程由年级、科目和学年组成,我如何实施或应用HAS-A
概念
在这一点上,我不能继续使用二传手和传接手,因为我不知道哪种方法是正确的。我希望能够正确地应用OOP概念
如果您能给我任何建议或帮助,我将不胜感激 第二种方法似乎是最好的,第一种和第三种方法似乎在类之间有很多不推荐的依赖性
请注意,SchoolYeal和YearLevel应该是接口或抽象,而不是实现,否则我们仍然会陷入依赖性问题。第二种方法似乎是最好的,第一种和第三种方法似乎在类之间有很多不推荐的依赖性 请注意,SchoolYeal和YearLevel应该是接口或抽象,而不是实现,否则我们仍然会陷入依赖性问题。关联、聚合和组合的“正确”概念都是关于生命周期和关系的。因此,最重要的问题是“哪些对象可以独立于哪些对象而存在?”以及“两个对象(A-owns-B、A-knows-B、A-component-of-B)之间的关系有多强?” 如果你想为你的班级
课程(作为所有者)使用聚合概念,这意味着课程
将有一个学年
,也将有一个年级
,但它们都有自己的生命周期。因此,如果您销毁课程
,其他对象仍将存在。这可以像第二种方法一样实现:
public class Curriculum {
SchoolYear schoolYear;
YearLevel yearLevel;
public Curriculum(SchoolYear sy, YearLevel yl ){
this.schoolYear = sy;
this.yearLevel = yl;
}
}
如果你想在它们之间建立更紧密的关系,你需要一个组合概念,其中a是由B组成的,所以它们的生命周期是相同的。如果你摧毁了A,你也摧毁了B。这意味着B不属于A就不可能存在。就像一座建筑是由房间组成的,但是一个房间可以没有建筑而存在吗?
要绘制生命周期图,您需要像第一种方法一样,在实例化课程时创建YearLevel
和SchoolYear
依我看你对这件事没意见。
如果将<>代码>主题<代码>添加到<代码>课程中,你应该考虑使用构图。 < P> < <强>关联< <强> > <强>聚合> /强>和<强>构图< /强>都是关于生命周期和关系的。因此,最重要的问题是“哪些对象可以独立于哪些对象而存在?”以及“两个对象(A-owns-B、A-knows-B、A-component-of-B)之间的关系有多强?”
如果你想为你的班级课程(作为所有者)使用聚合概念,这意味着课程
将有一个学年
,也将有一个年级
,但它们都有自己的生命周期。因此,如果您销毁课程
,其他对象仍将存在。这可以像第二种方法一样实现:
public class Curriculum {
SchoolYear schoolYear;
YearLevel yearLevel;
public Curriculum(SchoolYear sy, YearLevel yl ){
this.schoolYear = sy;
this.yearLevel = yl;
}
}
如果你想在它们之间建立更紧密的关系,你需要一个组合概念,其中a是由B组成的,所以它们的生命周期是相同的。如果你摧毁了A,你也摧毁了B。这意味着B不属于A就不可能存在。就像一座建筑是由房间组成的,但是一个房间可以没有建筑而存在吗?
要绘制生命周期图,您需要像第一种方法一样,在实例化课程时创建YearLevel
和SchoolYear
依我看你对这件事没意见。
如果你将<>代码>科目<代码>添加到你的代码>课程中,你应该考虑使用构图。x 3不是聚合。您构建的新对象在返回后与它的“父对象”不再有关系。在1和2之间,您可以讨论组合/聚合和关联之间的差异,但这是毫无意义的。做最适合你的事情。这些学年级和年级级的建设者没有理由吗?哪一年?哪一层?这些是价值对象还是可以共享并拥有自己的身份?#3不是聚合。您构建的新对象在返回后与它的“父对象”不再有关系。在1和2之间,您可以讨论组合/聚合和关联之间的差异,但这是毫无意义的。做最适合你的事情。这些学年级和年级级的建设者没有理由吗?哪一年?哪一层?这些是价值对象还是可以共享并拥有自己的标识?Wny不能实现它们吗?我不建议使用抽象类,因为这样你就不能像问题中那样实现它们了。我的想法是忽略对象的实现来降低两个类之间的依赖性。在第一种方法中,如果