Вопрос должен заключаться в том, как лучше всего смоделировать это, для чего ответом будет «то, как это имеет смысл в реальном мире», т. Е. Аспирант также может преподавать и проходить курс; -)
Не пытайтесь связать все с шаблонами дизайна. Придерживайтесь основного принципа, который мы усвоили в школе «Классы моделей объектов реального мира», «Держите модель ближе к реальному миру»
interface CanTeach
{
void teachCource();
}
class Teacher implements CanTeach {...}
class Student
{
void takeCourse(...);
}
class GradStudent extends Student implements CanTeach
{
...
}