正确应用OOP聚合概念的方法

时间:2016-05-14 13:42:43

标签: java oop aggregation composition

我正在修复系统的OOP设计,因为我认为架构存在缺陷。我要重写正确的面向对象应用程序的类,例如它的继承,接口和聚合/组合,以便正确重用代码和关系。

说我有课程班,学科班,学年班,年级班,我想将HAS-A聚合)的概念应用为

课程HAS-A主题 课程HAS-A年级 课程HAS-A学年 主题HAS-A学年 主题HAS-A年级

这样就足够了:

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();
   }

我不认为是正确的,因为我没有看到重新创建相同方法只是说课程类HAS-A YearLevel。

如果课程由年级,科目和学年组成,我如何实施或应用HAS-A概念?

此时我无法继续使用setter和getter,因为我不知道哪种方法是正确的。我希望能够正确应用OOP概念。

我很感激任何建议或帮助。

2 个答案:

答案 0 :(得分:2)

关联聚合合成的“正确”概念都与生命周期和关系有关。所以最重要的问题是“哪些对象可以独立于哪些对象存在?”和“两个物体之间的关系有多强(A-owns-B,A-know-B,A-composed-of-B)?”

如果您想为您的班级Curriculum(作为所有者)使用聚合概念,则意味着Curriculum会有SchoolYear并且也会有一个YearLevel,但他们都有自己的生命周期。因此,如果您销毁Curriculum,其他对象仍然存在。这可以像你的第二种方法一样实现:

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时,需要创建SchoolYearCurriculum

从我的观点来看,你对这一方面的聚合很好。 如果您要将Subjects添加到Curriculum,则应考虑使用合成。

答案 1 :(得分:0)

第二种方法似乎是最好的,第一种和第三种方法似乎在不推荐的类之间有很大的依赖性。

请注意,SchoolYeal和YearLevel应该是接口或摘要,但不是实现,否则我们仍然会陷入依赖问题。