Я бы скорее стремился к внедрению зависимостей в сочетании с шаблоном проектирования декоратора
В основном коде я бы обработал инициализацию ученика и передал ее, чтобы ее оформить
studentObj = new Student();
decoratedStudentObj = new A(studentObj);
finalStudentObj = decoratedStudentObj.getStudent()
Который вызвал бы метод getStudent () во всех разных классах и изменил бы весь объект ученика в каскаде.
Так что в итоге вы могли бы получить что-то вроде этого:
studentObj = new Student();
decoratedStudentObj = new A(studentObj);
decoratedStudentObj = new A(decoratedStudentObj );
decoratedStudentObj = new B(decoratedStudentObj);
decoratedStudentObj = new C(decoratedStudentObj );
finalStudentObj = decoratedStudentObj.getStudent()
Другое преимущество внедрения зависимостей позволит вам определять разные типы учащихся, и вам придется дублировать любой код, если все объекты учащихся реализуют один и тот же интерфейс / набор методов
IE:
studentObj = new Student()
decoratedStudentObj = new A(studentObj);
finalStudentObj = decoratedStudentObj.getStudent()
highSchoolStudentObj = new HighSchoolStudent()
decoratedHighSchoolStudentObj = new A(highSchoolStudentObj);
decoratedHighSchoolStudentObj = new B(decoratedHighSchoolStudentObj );
finalHighSchoolStudentObj = decoratedHighSchoolStudentObj .getStudent()
collegeStudentObj = new CollegeStudent()
decoratedCollegeStudentObj = new A(collegeStudentObj );
decoratedCollegeStudentObj = new C(decoratedCollegeStudentObj);
finalCollegeStudentObj = decoratedCollegeStudentObj.getStudent()
И, наконец, проще реализовать UnitTesting, так как вы можете легко насмехаться над классом ученика, чтобы самостоятельно протестировать его класс обработки.