Content Observer è un'implementazione di Observer Pattern?

3

Il modello di osservatore è definito dalla "Banda di quattro" Design Patterns book come" dipendenza uno-a-molti tra oggetti in modo che quando un oggetto cambia stato, tutti i suoi dipendenti vengono avvisati e aggiornati automaticamente ".

DiconoanchecheilpatternObserverdovrebbeessereusatoinunaqualsiasidelleseguentisituazioni:

  • Whenanabstractionhastwoaspects,onedependentontheother.Encapsulatingtheseaspectsinseparateobjectsletsyouvaryandreusethemindependently.

  • Whenachangetooneobjectrequireschangingothers,andyoudon'tknowhowmanyobjectsneedtobechanged.

  • Whenanobjectshouldbeabletonotifyotherobjectswithoutmakingassumptionsaboutwhotheseobjectsare.Inotherwords,youdon'twanttheseobjectstightlycoupled.

SuAdamStroud Libro delle migliori pratiche del database Android afferma che " la classe Cursor fornisce i metodi che espongono il pattern Observer a una fonte di dati. E, utilizzando questi metodi, è possibile rispondere alle modifiche dei dati utilizzando il pattern Observer piuttosto che interrogare il database per le modifiche, che possono essere inefficienti ":

  • Cursor.registerContentObserver()

  • Cursor.unregisterContentObserver()

  • Cursor.setNotificationUri()

Allo stesso modo, usando un ContentProvider, possiamo usare un oggetto client ContentResolver per accedere ai dati dal Content Provider e quindi registrare un ContentObserver per ascoltare la modifica dei dati dietro l'URI per cui è stato registrato l'osservatore.

Quindi, come oggetto Subject nel pattern Observer, ContentResolver ha i metodi che, a mio avviso, sono quasi gli stessi:

  • registerContentObserver() of ContentResolver is Attach() from Subject

  • unregisterContentObserver() of ContentResolver is Dettach() from Subject

  • notifyChange() of ContentResolver is Notify() from Subject

Quindi, la mia domanda è, se i tre componenti di ContentProvider (ContentProvider, ContentResolver e ContentObserver) sono di per sé un'implementazione del pattern Observer?

    
posta Ricardo Faria 20.03.2018 - 20:51
fonte

1 risposta

2

Sì e no.

Sì, perché il modello di interazione descritto in Observer esiste in queste classi in forma semantica equivalente.

No, perché c'è molto di più in corso in quelle classi oltre a Observer. Tra di loro gestiscono anche la persistenza dei dati, la comunicazione tra processi, gli aggiornamenti sincroni e asincroni e molto altro.

Il pattern Observer e molti altri di GoF sono stati identificati in parte per consentire la composizione e il riutilizzo del codice attraverso implementazioni di tipo mixin leggero. Questo potrebbe essere fatto in C ++, molto meno in Java.

Java, naturalmente, per molte ragioni tende verso classi grandi e pesanti che non fanno mai solo una cosa. In Java, non puoi semplicemente prendere in prestito i bit del pattern Observer da quelle classi e usarli altrove. Dovresti invece reimplementare il modello.

Quindi- queste classi implementano il modello, ma non sono necessariamente un'implementazione modello del modello, in linea con lo spirito originale di GoF.

    
risposta data 26.03.2018 - 07:12
fonte

Leggi altre domande sui tag