Ho la seguente gerarchia di tipi:
interface I:
----+class B implements I
----+class C implements I
----+class D implements I
Ho un'altra classe Consumer1
che supporta tipi C
e D
ma non B
(nei suoi vari metodi) e una classe Consumer2
che supporta il tipo B
. Ho il controllo totale su Consumer1
e Consumer2
, quindi posso scegliere come implementarli. Ora, in fase di esecuzione, mi aspetto che i miei chiamanti mi forniscano una raccolta di I
s e deciderò internamente se indirizzarli a Consumer1
o Consumer2
.
Ora, un pessimo modo non-OOP è di fare un controllo di if instanceof
su tutto il posto e fare casino. Un'alternativa è registrare una classe di supporto Map<Class<?>, Class<?>>
che deve contenere {{B,Consumer2}, {C,Consumer1}, {D,Consumer1}}
. È pessimo come il precedente perché dovrò eseguire il cast degli oggetti dopo aver capito se inviarli a Consumer1
o Consumer2
.
Una seconda alternativa consiste nell'applicare un modello Visitor
che risolverebbe questo piuttosto ordinatamente, ma impedisce che la mia interfaccia venga ulteriormente estesa (a meno che non modifico il visitatore). C'è un'alternativa più ordinata?