2011-02-06 6 views
206

Estoy haciendo una pequeña investigación de plataformas móviles y me gustaría saber qué patrones de diseño se usan en Android.¿Qué patrones de diseño se usan en Android?

p. Ej. en iOS Model-view-controller se usa ampliamente junto con delegación y otros patrones.

¿Qué patrones y dónde usa Android en particular?

EDITAR

No estoy pidiendo patrones de diseño utilizados en el núcleo profundo, Dalvik y así sucesivamente, pero acerca de los patrones que se reunirá un desarrollador de aplicaciones, mientras que el desarrollo de una aplicación.

+2

Dado que la plataforma Android incorpora un kernel de Linux, es un paquete de software demasiado grande para responder a esta pregunta que no sean 'todos los patrones nombrados hasta ahora, y probablemente algunos nuevos si mira con suficiente atención' –

+3

@Pete , Ok, probablemente tengas razón, pero al mismo tiempo no voy tan profundo como kernel, estoy interesado en la superficie de aplicación, por ejemplo en iOS 'UIViewController' implementado usando MVC (' UIViewController' es un controlador y su raíz 'UIView' es view),' UIApplication' usa delegación que tiene delegado de aplicación como delegado y así sucesivamente ... – Burjua

+3

Creo que deberías aprender Android desde de abajo hacia arriba y no intente "portar" su conocimiento de iOS a Android. Hay muchos libros geniales por ahí. Apress hace un montón. Si comprende la aplicación y el ciclo de vida del servicio en Android, debería poder obtener instrucciones sobre cómo diseñarlas correctamente. – blindstuff

Respuesta

285

He intentado utilizar los patrones de diseño model–view–controller (MVC) y model–view–presenter para hacer el desarrollo de Android. Mis hallazgos son modelo-vista-controlador funciona bien, pero hay un par de "problemas". Todo se reduce a cómo percibes la clase Android Activity. ¿Es un controlador o es una vista?

La clase actual Activity no amplía la clase View de Android, pero sí controla la visualización de una ventana para el usuario y también maneja los eventos de esa ventana (onCreate, onPause, etc.).

Esto significa que cuando esté utilizando un patrón MVC, su controlador será realmente un controlador de pseudo-vista. Dado que se encarga de mostrar una ventana al usuario, con los componentes de vista adicionales que se le han agregado con setContentView, y también el manejo de eventos para al menos los diversos eventos del ciclo de vida de la actividad.

En MVC, se supone que el controlador es el principal punto de entrada. Lo cual es un poco discutible si este es el caso cuando se aplica al desarrollo de Android, ya que la actividad es el punto de entrada natural de la mayoría de las aplicaciones.

Debido a esto, personalmente encuentro que el modelo modelo-vista-presentador es perfecto para el desarrollo de Android. Dado que la función de la vista en este patrón es:

  • Servir como punto de entrada
  • componentes Rendering
  • eventos de usuario de enrutamiento al presentador

Esto le permite implementar su modelo de este modo:

Ver - contiene los componentes de la IU y gestiona los eventos para ellos.

Presentador - esto controlará la comunicación entre su modelo y su vista, mírelo como una puerta de entrada a su modelo. Es decir, si tiene un modelo de dominio complejo que representa, Dios sabe qué, y su vista solo necesita un subconjunto muy pequeño de este modelo, el trabajo de los presentadores es consultar el modelo y luego actualizar la vista. Por ejemplo, si tiene un modelo que contiene un párrafo de texto, un título y un conteo de palabras. Pero en una vista determinada, solo necesita mostrar el título en la vista. Luego, el presentador leerá los datos necesarios del modelo y actualizará la vista en consecuencia.

Modelo - este debería ser básicamente el modelo de dominio completo.Con suerte, también ayudará a que su modelo de dominio sea más "ajustado", ya que no necesitará métodos especiales para tratar los casos mencionados anteriormente.

Al desacoplar el modelo de la vista de todos juntos (a través del uso del presentador), sino que también se convierte en mucho más intuitivo para poner a prueba su modelo. Puede tener pruebas unitarias para su modelo de dominio y pruebas unitarias para sus presentadores.

Pruébelo. Personalmente creo que es una gran opción para el desarrollo de Android.

+12

¡Gran respuesta! Sin embargo, tengo preguntas: 1. Actividad = Ver, ¿lo entendí bien? 2. ¿Implementarías al presentador como su propia clase pública, o como una clase interna de la Actividad? O un fragmento (también clase interna)? 3. ¿Quiere decir que las clases de transferencia se utilizarán como en lugar de las clases de modelo reales en la Actividad (vista)? – manmal

+12

1. Sí, los uso como vistas dentro del patrón de MVP. 2. personalmente, los segrego en clases públicas individuales, pero esto es una cuestión de gustos, supongo :) 3. Expliqué esto bastante mal, la frase "reenviar las clases necesarias" es engañosa. Lo que quiero decir es que el presentador se encuentra entre la vista y el modelo, lee el modelo y luego actualiza la vista. Voy a actualizar mi respuesta para ser un poco más claro :) – JustDanyul

+0

gracias por tomarse el tiempo, lo entiendo ahora :) – manmal

38

Hay varios patrones utilizados en el marco de Android como:

  • Receptor de radio utiliza patrón Observer
  • invocación de servicio más a distancia utiliza el patrón Proxy
  • Vista y el grupo de vista utiliza patrón Composite
  • medios usan marco patrón
+4

puede por favor compartir los enlaces (referencias) – shanraisshan

+0

por favor comparta la referencia para que pueda encontrar más información al respecto. Gracias –

3

Todos estos patrones, MVC, MVVM, MVP, y Presentation Model, se puede aplicar a aplicaciones de Android, pero sin un marco de terceros, que no es fácil de conseguir bien organizado estructura y código limpio

MVVM tiene su origen en PresentationModel. Cuando aplicamos MVC, MVVM y Presentation Model a una aplicación de Android, lo que realmente queremos es tener un proyecto estructurado claro y, lo que es más importante, más fácil para las pruebas unitarias.

Por el momento, sin un marco de terceros, normalmente tiene muchos códigos (como addXXListener(), findViewById(), etc.), que no agrega ningún valor comercial. Además, debe ejecutar pruebas de la unidad de Android en lugar de las pruebas JUnit normales, que tardan años en ejecutarse y hacen que las pruebas unitarias sean poco prácticas.

Por estos motivos, hace algunos años comenzamos un proyecto de código abierto, RoboBinding - Un marco de modelo de presentación vinculante para la plataforma Android. RoboBinding te ayuda a escribir código de UI que es más fácil de leer, probar y mantener. RoboBinding elimina la necesidad de código innecesario como addXXListener o menos, y cambia la lógica de UI al modelo de presentación, que es un POJO y se puede probar a través de pruebas JUnit normales. RoboBinding viene con más de 300 pruebas JUnit para garantizar su calidad.

4

Android también usa el patrón de diseño ViewHolder.

Se usa para mejorar el rendimiento de un ListView mientras se lo desplaza.

El patrón de diseño ViewHolder le permite acceder a cada vista de lista de elementos sin la necesidad de mirar hacia arriba, ahorrando valiosos ciclos de procesador. Específicamente, evita llamadas frecuentes de findViewById() durante el desplazamiento de ListView, y eso lo suavizará.

63

Esta respuesta se ha actualizado con el fin de seguir siendo relevante a partir de noviembre el año 2016


Parece que usted está buscando para architectural patterns en lugar de design patterns.

Los patrones de diseño tienen como objetivo describir un "truco" general que el programador podría implementar para manejar un conjunto particular de tareas de software recurrentes. Por ejemplo: en OOP, cuando existe la necesidad de que un objeto notifique a un conjunto de otros objetos sobre algunos eventos, se puede emplear el observer design pattern.

Dado que las aplicaciones de Android (y la mayoría de AOSP) están escritas en Java, que está orientado a objetos, creo que tendrá dificultades para buscar un único patrón de diseño de OOP que NO se use en Android.

patrones arquitectónicos, por el contrario, no se ocupan de tareas de software particulares - Su objetivo es proporcionar plantillas para organización de software basado en los casos de uso del componente de software en cuestión.

Suena un poco complicado, pero espero que un ejemplo aclare: si alguna aplicación se utilizará para obtener datos de un servidor remoto y presentarlo al usuario de una manera estructurada, entonces MVC podría ser un buen candidato para consideración. Tenga en cuenta que no dije nada sobre las tareas de software y el flujo de programas de la aplicación; simplemente lo describí desde el punto de vista del usuario, y surgió un candidato para un patrón arquitectónico.

Como mencionó MVC en su pregunta, creo que los patrones arquitectónicos son lo que está buscando.

Enter image description here


Históricamente, no había directrices oficiales de Google sobre las arquitecturas de aplicaciones, que (entre otras razones) condujeron a un desastre total en el código fuente de aplicaciones de Android. De hecho, incluso hoy en día la mayoría de las aplicaciones que veo todavía no siguen las mejores prácticas de OOP y no muestran una clara organización lógica del código.

Pero hoy la situación es diferente: Google lanzó recientemente el Data Binding library, que está completamente integrado con Android Studio, e, incluso, implementó un conjunto de architecture blueprints for Android applications.

Hace dos años era muy difícil encontrar información sobre MVC o MVP en Android. Hoy, MVC, MVP y MVVM se han convertido en "palabras de moda" en la comunidad de Android, y estamos rodeados de innumerables expertos que constantemente intentan convencernos de que MVx es mejor que MVy. En mi opinión, discutir si MVx es mejor que MVy es totalmente inútil porque los términos en sí son muy ambiguos; solo mira las respuestas al this question, y te darás cuenta de que diferentes personas pueden asociar estas abreviaturas con construcciones completamente diferentes.

Debido a que oficialmente se ha iniciado la búsqueda del mejor patrón arquitectónico para Android, creo que estamos a punto de ver que salen a la luz varias ideas más. En este punto, es realmente imposible predecir qué patrones (o patrones) se convertirán en estándares de la industria en el futuro; tendremos que esperar y ver (supongo que es cuestión de un año o dos).

Sin embargo, hay una predicción que puedo hacer con un alto grado de confianza: El uso de la biblioteca de enlace de datos no se convertirá en un estándar de la industria. Confío en decirlo porque la biblioteca de enlace de datos (en su implementación actual) proporciona ganancias de productividad a corto plazo y algún tipo de pauta arquitectónica, pero hará que el código no sea sostenible a largo plazo. Una vez que surjan los efectos a largo plazo de esta biblioteca, se abandonará.


Ahora, a pesar de que tienen algún tipo de directrices oficiales y herramientas de hoy, yo, personalmente, no creo que estas directrices y herramientas son las mejores opciones disponibles (y definitivamente no son los únicos) . En mis aplicaciones uso mi propia implementación de una arquitectura MVC. Es simple, limpio, legible y comprobable, y no requiere bibliotecas adicionales.

Este MVC no solo es estéticamente diferente de los demás, sino que se basa en una teoría que dice Activities in Android are not UI Elements, que tiene enormes implicaciones en la organización del código.

Por lo tanto, si está buscando un buen patrón arquitectónico para las aplicaciones de Android que sigue los principios SOLID, puede encontrar una descripción de uno en mi publicación sobre MVC and MVP architectural patterns in Android.

+1

¡Bien hecho por proporcionar tales recursos! ¡Gracias! – Aleksandar

+1

¡Enlaces muy útiles! – Semaphor

8

En el caso Notifications, la NotificationCompat.Builder utiliza Constructor Patrón

como,

mBuilder = new NotificationCompat.Builder(this) 
        .setSmallIcon(R.drawable.ic_stat_notification) 
        .setContentTitle(getString(R.string.notification)) 
        .setContentText(getString(R.string.ping)) 
        .setDefaults(Notification.DEFAULT_ALL); 
+2

Este es en realidad el patrón de Constructor. – Piovezan

+0

@Piovezan Estoy equivocado. Gracias por corregirme. Pensé que era una versión simple de Decorator Pattern. –

0

En Android el patrón "procesador de cola de trabajo" se utiliza comúnmente para descargar tareas del hilo principal de una aplicación.

Ejemplo: El diseño de la clase IntentService.

IntentService recibe los Intents, inicia un hilo de trabajo y detiene el servicio según corresponda. Todas las solicitudes se manejan en un solo hilo de trabajo.

15

las siguientes clases Android utiliza patrones de diseño

1) Ver la funda utiliza diseño Singleton patrón

2) Intención utiliza la fábrica del diseño del patrón

3) adaptador utiliza Diseño Adaptador Patrón

4) Receptor de difusión utiliza patrón de diseño de observador

5) La vista utiliza el patrón de diseño compuesto

6) Medios marco utiliza patrones de diseño de fachadas

18

Aquí es un gran artículo sobre Common Design Patterns for Android:

patrones de creación:

  • Builder (por ejemplo, AlertDialog.Builder)
  • Dependency Injection (p. Ej.Dagger 2)
  • Singleton

patrones estructurales:

  • adaptador (por ejemplo RecyclerView.Adapter)
  • Fachada (por ejemplo reequipamiento)

patrones de comportamiento:

  • de comandos (por ejemplo, EventBus)
  • Observer (por ejemplo RxAndroid)
  • Modelo Vista Controlador
  • Modelo Vista ViewModel (similar al patrón MVC anteriormente)
+1

Puntos clave del artículo sería bueno. –

+0

Si bien esto puede responder teóricamente a la pregunta, [sería preferible] (// meta.stackoverflow.com/q/8259) incluir aquí las partes esenciales de la respuesta y proporcionar el enlace de referencia. –

0

Carpeta utiliza "patrón de observador" para la muerte Notificaciones del destinatario

16

enter image description here

cuando llegue a este post realmente me ayude a comprender los patrones con el ejemplo, así que he hacer tabla abajo para ver claramente los patrones de diseño & su ejemplo en el marco de Android

espero que encontrará es útil.

+1

** ** [editar] ** su publicación y muestre el contenido real como texto en lugar de capturas de pantalla. Otros no pueden copiar y pegar de tus imágenes o ayudarte a corregir tus errores tipográficos. [Ver aquí] (https://meta.stackoverflow.com/a/285557/1402846) para más detalles. Gracias. – Pang