Ho due classi, Bar
e Baz
. Entrambe le sottoclasse della classe astratta Foo
che ha un metodo doThing()
. Bar
implementa un'interfaccia funzionale Now
che contiene il metodo doThingNow()
mentre Baz
implementa un'interfaccia funzionale Later
che contiene il metodo doThingLater()
. È probabile che avrò più classi lungo la linea che sottoclasse Foo
, ma mi aspetto che tutte implementino Now
o Later
. Sto discutendo tra due potenziali progetti, ma spero che qualcuno possa aiutarmi a capire perché uno potrebbe essere preferibile all'altro.
Progetto 1: Rendo doThing()
astratto e costringo ogni sottoclasse a implementarlo. L'implementazione per ogni classe chiamerà semplicemente il metodo dell'interfaccia.
Progettazione 2: implemento doThing
come segue:
public void doThing() {
if (this instanceof Now) {
((Now) this).doThingNow();
} else if (this instanceof Later) {
((Later) this).doThingLater();
} else {
throw new RuntimeException("Foo subclass must implement Now or Later!");
}
}
La progettazione sembra richiedere più codice duplicato in sottoclassi e non garantisce che le sottoclassi implementeranno Now
o Later
. Disegna due modelli per il comportamento che voglio, ma a dire il vero mi sembra che mi sia sbagliato a causa del casting. Non mi sento particolarmente bene nei due approcci, il che mi fa pensare che ci sia un difetto di progettazione più fondamentale con quello che sto facendo. Uno di questi modelli è estremamente meno flessibile / manutenibile e, in tal caso, perché? Se eliminassi entrambi i pattern a favore di un'alternativa diversa, sarei felice di ascoltare i suggerimenti e la motivazione che li spinge.