Definire un oggetto con l'interfaccia come tipo invece del nome della classe [duplicato]

2

Cerco di esercitarmi con gli schemi di progettazione ed esplorare una delle possibili implementazioni del modello di progettazione degli osservatori in Java. Ho prestato attenzione, che in questo esempio l'oggetto è definito con il tipo di interfaccia e non con quello di classe:

//user-made observer interface
public interface Observer {…}

//observer class to watch after subject objects
public class MyTopicSubscriber implements Observer {…}

//subject class to notify observer of any updates
public class MyTopicPublisher implements Subject {
     private List<Observer> observers;
}

Come puoi vedere, l'elenco observers è un tipo di Observer , che è un'interfaccia. Perché un programmatore, in questo caso, ha deciso di utilizzare l'interfaccia come tipo per l'elenco di oggetti e non il nome della classe MyTopicSubscriber ?

L'esempio di codice completo pubblicato sopra:
link

Aggiornamento ai moderatori:
In questa domanda, non chiedo quale sia esattamente l'interfaccia, ma perché valga la pena usare l'interfaccia come un tipo di oggetti della collezione. Pertanto, la mia domanda non può essere considerata un possibile duplicato della domanda proposta, che riguarda la spiegazione di base di quali interfacce sono in programmazione, la mia domanda è più stretta e specifica.

Grazie.

    
posta Mike B. 25.07.2015 - 18:05
fonte

1 risposta

3

Questo è esattamente ciò che le interfacce sono per. Il programmatore non si preoccupa di quali tipi di oggetti potrebbero essere presenti nell'elenco, purché forniscano le chiamate al metodo previste da qualsiasi Observer. In questo modo, l'elenco può contenere istanze di MyTopicSubscriber, MyFileSystemChangeSubscriber, MyMailboxSubscriber, ecc. (Questi sono titoli fittizi, ovviamente).

Usando le interfacce nel tuo progetto, ti permetti una maggiore flessibilità nel tuo modello, perché ora hai più tipi di oggetti osservati, con una semplice interfaccia Observable. In un progetto basato esclusivamente sull'eredità, tutto ciò che è Osservabile dovrebbe essere derivato da una singola classe, persino classi che non hanno nulla in comune l'una con l'altra, tranne che si desidera osservarle.

Questo tipo di design basato sull'interfaccia si presta molto bene al test delle unità, poiché ora puoi simulare qualsiasi oggetto e inserirlo nella tua lista per generare i tipi di comportamenti che vuoi testare. Finché è Osservabile e fornisce i metodi previsti per qualsiasi Osservabile, il tuo codice non si preoccuperà che si tratti di un oggetto di prova specializzato, piuttosto che di un oggetto normale dalla tua applicazione.

    
risposta data 25.07.2015 - 18:18
fonte

Leggi altre domande sui tag