让我们考虑一个示例,其中我必须对以下内容进行建模:
StudentExamSchedulerClassExamScheduler,目前它取决于StudentExamScheduler提供的逻辑。因此,由于这两个类都安排了考试,所以我创建了一个接口ExamScheduler,这两个类都将实现这个接口。原因是:
这就是界面的样子:
interface ExamScheduler {
scheduleExam(data);
}现在,我的每个具体类都实现了这个接口,ClassExamScheduler现在使用StudentExamScheduler来委派一些职责。
class ClassExamScheduler implements ExamScheduler {
private ExamScheduler studentExamScheduler;
public scheduleExam() {
studentExamScheduler.scheduleExam();
// do other stuff
}
}这是接口和组合的有效使用吗?通常,我看到Interface被用于多态性。但是在这个用例中,我使用它来提供灵活性,以便在需求发生变化时注入新的类。
发布于 2016-07-06 14:16:55
studentExamScheduler应该被命名为examScheduler。由于要注入它,所以不应该以ExamScheduler的特定实现命名变量。Scheduler接口,其中包含一个调度表(ScheduleData数据);这样的接口可以由任何类型的调度器实现,比如LessonScheduler、MeetingScheduler等等。发布于 2016-07-06 15:06:28
使用这样的接口通常是一种简单而干净的方式来提供灵活性。例如,您可以在运行时更改ClassExamScheduler实例的实现,而无需修改源代码。这可以通过为studentExamScheduler分配另一种类型的ExamScheduler来实现,后者提供了一些其他的调度方法。这种多态性是使用接口的主要好处之一。
然而,
我不认为让ClassExamScheduler实现ExamScheduler有什么真正的好处。我明白你对作文的看法,因为两门课都安排了考试,所以他们可以采用一种通用的方法。
但这意味着ClassExamScheduler可以通过使用另一个ClassExamScheduler实例作为中间人来实现它的.scheduleExam(..)-method,这在我看来有点奇怪,也没有必要的复杂。
第二,如果不谨慎地使用此结构,则可能导致程序失败。如果ClassExamScheduler实现一个封闭的ClassExamSchedulers链,如下所示:
ClassExamScheduler A, B, C;
A.studentExamScheduler = B;
B.studentExamScheduler = C;
C.studentExamScheduler = A;甚至是其本身:
ClassExamScheduler A;
A.studentExamScheduler = A;您将得到一个递归循环,该循环将以堆栈溢出结束。
我认为这里微妙的区别是,StudentExamScheduler安排考试,而ClassExamScheduler使用ExamScheduler (即StudentExamScheduler)间接地安排考试。
https://softwareengineering.stackexchange.com/questions/324119
复制相似问题