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
ClassExamScheduler
e 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.