Consideriamo un esempio in cui devo modellare il seguente:
- Classe per programmare esami per uno studente, chiamiamolo
StudentExamScheduler - Classe per pianificare un esame per una classe. Chiamiamolo
ClassExamSchedulere attualmente dipende dalla logica fornita daStudentExamScheduler.
Quindi, poiché entrambe le classi programmavano gli esami, ho creato un'interfaccia ExamScheduler che entrambe le classi avrebbero implementato. Il motivo è:
- Stanno essenzialmente pianificando esami
- mi darebbe la flessibilità di scambiare gli scheduler in-and-out con le modifiche di funzionalità.
Ecco come apparirà l'interfaccia:
interface ExamScheduler {
scheduleExam(data);
}
Ora ogni mia classe concreta implementa questa interfaccia e ClassExamScheduler ora usa StudentExamScheduler per delegare alcune responsabilità.
class ClassExamScheduler implements ExamScheduler {
private ExamScheduler studentExamScheduler;
public scheduleExam() {
studentExamScheduler.scheduleExam();
// do other stuff
}
}
È un uso valido di Interface & Composizione? In genere ho visto l'interfaccia utilizzata per il polimorfismo. Ma in questo caso d'uso lo uso per darmi la flessibilità di iniettare nuove classi quando i requisiti cambiano.