首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java:实现相同接口的类的组合

Java:实现相同接口的类的组合
EN

Software Engineering用户
提问于 2016-07-06 13:40:59
回答 2查看 5.4K关注 0票数 3

让我们考虑一个示例,其中我必须对以下内容进行建模:

  1. 类来安排学生的考试,让我们称之为StudentExamScheduler
  2. 为一堂课安排考试。让我们称它为ClassExamScheduler,目前它取决于StudentExamScheduler提供的逻辑。

因此,由于这两个类都安排了考试,所以我创建了一个接口ExamScheduler,这两个类都将实现这个接口。原因是:

  • 他们实际上是在安排考试。
  • 当功能发生变化时,我可以灵活地交换调度程序。

这就是界面的样子:

代码语言:javascript
复制
interface ExamScheduler {
       scheduleExam(data);
}

现在,我的每个具体类都实现了这个接口,ClassExamScheduler现在使用StudentExamScheduler来委派一些职责。

代码语言:javascript
复制
class ClassExamScheduler implements ExamScheduler {

  private ExamScheduler studentExamScheduler;

  public scheduleExam() {

    studentExamScheduler.scheduleExam();
    // do other stuff
  }
}

这是接口和组合的有效使用吗?通常,我看到Interface被用于多态性。但是在这个用例中,我使用它来提供灵活性,以便在需求发生变化时注入新的类。

EN

回答 2

Software Engineering用户

回答已采纳

发布于 2016-07-06 14:16:55

我的两分钱:

  • 接口的使用和组合之间没有矛盾。
  • 您使用的是多态性。依赖注入和委托是可能的,因为多态。

几个观察:

  • studentExamScheduler应该被命名为examScheduler。由于要注入它,所以不应该以ExamScheduler的特定实现命名变量。
  • 考虑创建一个更通用的Scheduler接口,其中包含一个调度表(ScheduleData数据);这样的接口可以由任何类型的调度器实现,比如LessonSchedulerMeetingScheduler等等。
票数 2
EN

Software Engineering用户

发布于 2016-07-06 15:06:28

使用这样的接口通常是一种简单而干净的方式来提供灵活性。例如,您可以在运行时更改ClassExamScheduler实例的实现,而无需修改源代码。这可以通过为studentExamScheduler分配另一种类型的ExamScheduler来实现,后者提供了一些其他的调度方法。这种多态性是使用接口的主要好处之一。

然而,

我不认为让ClassExamScheduler实现ExamScheduler有什么真正的好处。我明白你对作文的看法,因为两门课都安排了考试,所以他们可以采用一种通用的方法。

但这意味着ClassExamScheduler可以通过使用另一个ClassExamScheduler实例作为中间人来实现它的.scheduleExam(..)-method,这在我看来有点奇怪,也没有必要的复杂。

第二,如果不谨慎地使用此结构,则可能导致程序失败。如果ClassExamScheduler实现一个封闭的ClassExamSchedulers链,如下所示:

代码语言:javascript
复制
ClassExamScheduler A, B, C;
A.studentExamScheduler = B;
B.studentExamScheduler = C;
C.studentExamScheduler = A;

甚至是其本身:

代码语言:javascript
复制
ClassExamScheduler A;
A.studentExamScheduler = A;

您将得到一个递归循环,该循环将以堆栈溢出结束。

关于构图

我认为这里微妙的区别是,StudentExamScheduler安排考试,而ClassExamScheduler使用ExamScheduler (即StudentExamScheduler)间接地安排考试。

票数 2
EN
页面原文内容由Software Engineering提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://softwareengineering.stackexchange.com/questions/324119

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档