Вот постановка задачи: У нас есть интерфейсы/супер-классы для студентов и преподавателейПосетитель шаблон для двух аргументов
Студент имеет две реализации/суб clasees, ScienceStudent и PhysicalEducationStudent
Учитель имеет ScienceTeacher и PhysicalEducationTeacher.
Мы хотим реализовать метод getMeetingPoint (Student s, Teacher t), который возвращает место, где они встречаются, в зависимости от типа ученика и учителя.
Например, если его ScienceStudent и ScienceTeacher они встречаются в лаборатории если PEStudent и PETeacher они встречаются на Ground и если его ScienceStudent и PETeacher или наоборот, они встречаются в кафетерий
Мы можем написать наивный метод, который проверяет использование instanceof
. Но проблема в том, что это становится сложным, когда Учитель или Студент расширяется, и трудно поддерживать. что-то вроде этого:
public class MeetingPointDecider {
getMeetingPoint(Student s,Teacher t) {
if(s instanceof ScienceStudent && t instanceof ScienceTeacher) {
return "Lab";
} else if (s instanceof PhysicalEducationStudent && t instanceof PhysicalEducationTeacher) {
return "GRound";
}
.
.
.
}
}
Другого варианта написания завода, который принимает студент и преподаватель, и возвращает что-то вроде MeetingPointDecision [смолоть или Lab], но проблема остается. Есть ли хороший образец, который мы можем использовать, где нам не нужно изменять существующие классы (или минимальную модификацию) при добавлении нового класса. Скажем instanceof
ScienceStudent у нас есть ChemistryStudent, PhysicsStudent и ChemistryLab, PhysicsLab. Существует также возможность добавления большего количества действий, который отличается в реализации на основе студентов и типа учителя (где посетитель вариант, но не уверен, как реализовать с двумя решающими классами)
Может кто-то пожалуйста, Подсказать хороший способ реализовать это?
Спасибо!
Почему ученик должен быть примером PhysicalEducationTeacher ...'s instanceof PhysicalEducationTeacher' –
Спасибо за уведомление. Это была опечатка. Исправлено. – pks
Не было бы проще пойти обратным образом, и использовать фабрику * Лаборатория * будет возвращена кем-либо. Реализация интерфейса 'Науки' и * Земля * будет возвращена интерфейсом' Sports'. –