IntentService è un'implementazione di Command Pattern?

2

Secondo Wikipedia :

In object-oriented programming, the command pattern is a behavioral design pattern in which an object is used to encapsulate all information needed to perform an action or trigger an event at a later time. This information includes the method name, the object that owns the method and values for the method parameters.

E secondo il testo del professor Schmidt , un comando ha:

  • Esecuzione indipendente dal tempo della logica dell'applicazione. L'incapsulamento di la logica dell'applicazione consente di accodarla ed eseguirla in un punto diverso in tempo.
  • Esecuzione indipendente dal contesto della logica dell'applicazione. La separazione tra logica applicativa e contesto consente di eseguire l'applicazione in contesti separati, come in un thread diverso o utilizzando uno stato diverso.
  • Intercambiabilità della logica dell'applicazione. La separazione tra l'applicazione logica e contesto consentono di scambiare più facilmente la logica dell'applicazione.

Se incapsuli tutte le informazioni in un Intent , il onHandleIntent funziona come un metodo astratto per il comando executor, proprio come descritto al comando pattern del processore testo.

Pertanto, anziché implementare esplicitamente l'executor per richiamare un comando, è sufficiente delegare l'esecuzione del comando al sistema operativo.

Quindi le domande sono:

  1. IntentService è l'implementazione del framework per il pattern di comando?
  2. In caso affermativo, perché alcune implementazioni MVP per Android implementano esplicitamente le proprie, utilizzando ThreadExecutor come consumatore e Runnable come comandi, invece di usare quello fornito dal framework?
posta JP Ventura 25.01.2016 - 01:54
fonte

1 risposta

1

Direi che IntentService non è un'implementazione di framework del modello di progettazione command-executor, perché non soddisfa il requisito della separazione della logica dell'applicazione e del contesto dell'applicazione.

Il pattern command-executor è come fornire un pulsante su un telecomando per riprodurre alcune azioni su richiesta (attenuare le luci, chiudere le tende, accendere Barry Manilow) indipendentemente da chi lo preme in qualsiasi contesto. Comando-esecutore è analogo a materializzare un assistente personale che poi fa un gruppo di compiti predeterminati per te su richiesta.

D'altra parte, l'uso della classe IntentService è analogo a un pedone che saluta un taxi o un patrono di un pub che segnala il barista: l'agente richiede un servizio (esprime un intento), l'agente entra in coda per ricevere il servizio, l'agente riceve infine il servizio. A differenza del comando-esecutore, questa sequenza richiede la partecipazione dell'agente , che a sua volta richiede che l'agente sia nel giusto tipo di contesto per (desidera) ricevere il servizio. Ma questo non è ciò che il modello dell'esecutore comandante prescrive. In effetti, la panoramica della classe API per IntentService nel link che hai fornito suggerisce che la classe IntentService si adatta a un altro schema di progettazione stabilito:

This "work queue processor" pattern is commonly used to offload tasks from an application's main thread. The IntentService class exists to simplify this pattern and take care of the mechanics. To use it, extend IntentService and implement onHandleIntent(Intent). IntentService will receive the Intents, launch a worker thread, and stop the service as appropriate.

In un certo senso, IntentService potrebbe essere considerato un esecutore di comandi se solo l'oggetto del servizio potrebbe essere incluso nell'astrazione. Quindi, per le nostre analogie, se in qualsiasi momento desiderassimo, potremmo invocare un comando per "inviare a mia nipote Suzy il regalo di compleanno che le ho comprato" o "inviarmi a Pechino per completare la fusione aziendale", quindi IntentService potrebbe essere un comando- esecutore. Ma quando dichiariamo il confronto in questo modo, diventa chiaro che IntentService non può essere command-executor, perché questi eventi sono dipendenti dal contesto nel senso che hanno bisogno di oggetti o di partecipazioni degli agenti prima di essere in grado di correre. Questo non è vero per i command-executors, che confezionano tutti i componenti necessari per la riproduzione pronta in qualsiasi momento.

    
risposta data 28.01.2016 - 23:37
fonte

Leggi altre domande sui tag