If we don't know about [the] implementation, just the requirement specification, then go for interface.
Ciò significa che puoi tracciare un'architettura progettando e scrivendo le interfacce in primo luogo e rinvia la scrittura delle implementazioni che soddisfano tali interfacce in un secondo momento.
Supponiamo che tu sia uno dei progettisti dell'ambiente di sviluppo Java. Vuoi fornire una funzione di ordinamento per le tue raccolte. Ma non sai come ordinare i tipi personalizzati (ad esempio le classi definite dall'utente) perché non sai come determinare se un oggetto di una data classe è maggiore di un altro. Non puoi scrivere un'implementazione per quel confronto, perché non sai come farlo per qualsiasi classe data che qualcuno possa scrivere.
Quindi fornisci un'interfaccia chiamata Comparable
. Definisce un metodo
int compare<T>(T other)
che accetta come parametro un "altro" oggetto del tipo specificato e restituisce un numero che indica a Java se l'altro oggetto è uguale, maggiore o minore di this
oggetto. Ora puoi consentire alle persone di derivare la loro classe dalla tua interfaccia e scrivere un'implementazione del metodo Compare
. La tua funzione di ordinamento ora comprende come ordinare questi oggetti perché comprende Comparable
e può chiamare il loro metodo Compare
per confrontare due istanze dei loro oggetti.