Quels modèles d'architecture sont utilisés sur Android? [fermé]

268

Je fais une petite recherche sur les plates-formes mobiles et je voudrais savoir quels modèles de conception sont utilisés dans Android?

Par exemple, dans iOS Model-view-controller est très largement utilisé avec la délégation et d'autres modèles.

Quels modèles et où en particulier Android utilise-t-il?

ÉDITER

Je ne demande pas des modèles de conception utilisés profondément dans le noyau, dalvik et ainsi de suite, mais des modèles qu'un développeur d'application rencontrera lors du développement d'une application.

Burjua
la source
2
Étant donné que la plate-forme Android intègre un noyau Linux, il s'agit d'une suite de logiciels beaucoup trop importante pour répondre à cette question autre que `` tous les modèles nommés jusqu'à présent, et probablement quelques nouveaux si vous regardez attentivement ''
Pete Kirkham
5
@Pete, Ok, vous avez probablement raison, mais en même temps je ne vais pas aussi loin que le noyau, je m'intéresse à la surface d'application, par exemple dans iOS UIViewControllerimplémenté en utilisant MVC ( UIViewControllerest un contrôleur et sa racine UIViewest une vue) , UIApplicationutilise la délégation ayant Application Delegate comme délégué et ainsi de suite ...
Burjua
4
Je pense que vous devriez vraiment apprendre Android de bas en haut et ne pas essayer de "porter" vos connaissances d'iOS vers Android. Il y a beaucoup de bons livres là-bas. Apress fait un tas. Si vous comprenez le cycle de vie des applications et des services dans Android, vous devriez être en mesure de concevoir correctement les applications.
blindstuff
Cela pourrait aider: stackoverflow.com/a/49694378
Ali Nem

Réponses:

324

J'ai essayé d'utiliser à la fois les modèles architecturaux modèle – vue – contrôleur (MVC) et modèle – vue – présentateur pour faire le développement Android. Mes résultats sont que le modèle, la vue et le contrôleur fonctionnent bien, mais il y a quelques "problèmes". Tout dépend de la façon dont vous percevez la Activityclasse Android . Est-ce un contrôleur ou une vue?

La Activityclasse réelle n'étend pas la Viewclasse d'Android , mais elle gère cependant l'affichage d'une fenêtre pour l'utilisateur et gère également les événements de cette fenêtre (onCreate, onPause, etc.).

Cela signifie que lorsque vous utilisez un modèle MVC, votre contrôleur sera en fait un pseudo contrôleur de vue. Comme il gère l'affichage d'une fenêtre pour l'utilisateur, avec les composants de vue supplémentaires que vous y avez ajoutés avec setContentView, et gère également les événements pour au moins les divers événements du cycle de vie des activités.

Dans MVC, le contrôleur est censé être le point d'entrée principal. Ce qui est un peu discutable si c'est le cas lors de son application au développement Android, car l'activité est le point d'entrée naturel de la plupart des applications.

Pour cette raison, je trouve personnellement que le modèle modèle-vue-présentateur est un ajustement parfait pour le développement Android. Puisque le rôle de la vue dans ce modèle est:

  • Servir de point d'entrée
  • Composants de rendu
  • Routage des événements utilisateur vers le présentateur

Cela vous permet d'implémenter votre modèle comme suit:

Vue - elle contient vos composants d'interface utilisateur et gère les événements pour eux.

Présentateur - cela gérera la communication entre votre modèle et votre vue, regardez-la comme une passerelle vers votre modèle. Autrement dit, si vous avez un modèle de domaine complexe représentant, Dieu sait quoi, et votre vue n'a besoin que d'un très petit sous-ensemble de ce modèle, le travail des présentateurs consiste à interroger le modèle, puis à mettre à jour la vue. Par exemple, si vous avez un modèle contenant un paragraphe de texte, un titre et un nombre de mots. Mais dans une vue donnée, il vous suffit d'afficher le titre dans la vue. Le présentateur lira ensuite les données nécessaires du modèle et mettra à jour la vue en conséquence.

Modèle - il doit s'agir essentiellement de votre modèle de domaine complet. J'espère que cela contribuera également à rendre votre modèle de domaine plus "serré", car vous n'aurez pas besoin de méthodes spéciales pour traiter les cas comme mentionné ci-dessus.

En découplant le modèle de la vue tous ensemble (grâce à l'utilisation du présentateur), il devient également beaucoup plus intuitif de tester votre modèle. Vous pouvez avoir des tests unitaires pour votre modèle de domaine et des tests unitaires pour vos présentateurs.

Essaye le. Personnellement, je trouve que cela convient parfaitement au développement Android.

JustDanyul
la source
14
Très bonne réponse! J'ai des questions cependant: 1. Activité = Voir, ai-je bien compris? 2. Souhaitez-vous implémenter le présentateur comme sa propre classe publique, ou comme une classe interne de l'activité? Ou un fragment (également de classe interne)? 3. Voulez-vous dire que les classes de transfert doivent être utilisées à la place des classes de modèle réelles dans l'activité (vue)?
2011
14
1. Oui, je les utilise comme vues dans le modèle MVP. 2. personnellement, je les segmente en classes publiques individuelles, mais c'est une question de goût, je suppose :) 3. Je l'ai expliqué assez mal, la phrase "transmettre les classes nécessaires" est trompeuse. Ce que je veux dire, c'est que le présentateur se trouve entre la vue et le modèle, il lit le modèle puis met à jour la vue. Je
mettrai à
merci d'avoir pris le temps, je comprends maintenant :)
manmal
11
J'adore vraiment le développement Android car il est très découplé. Comment j'utilise MVC: utilisez les activités uniquement pour les utilisateurs IO et utilisez un service local pour tous vos traitements. Lorsque le service veut montrer quelque chose - diffusez-le dans vos activités! Je déteste vraiment quand les autres développeurs mettent trop de traitement dans les activités.
Quelqu'un Quelque part
8
@SomeoneSomewhere pourquoi ne pas avoir une classe qui gère ce genre de choses dans des threads / AsyncTasks séparés, pourquoi un service?
Garçon
87

Mise à jour de novembre 2018

Après avoir travaillé et blogué sur MVC et MVP dans Android pendant plusieurs années (voir le corps de la réponse ci-dessous), j'ai décidé de capturer mes connaissances et ma compréhension sous une forme plus complète et facilement digestible.

J'ai donc publié un cours vidéo complet sur l'architecture des applications Android. Donc, si vous souhaitez maîtriser les modèles architecturaux les plus avancés du développement Android, consultez ce cours complet ici .

Cette réponse a été mise à jour afin de rester pertinente en novembre 2016


Il semble que vous recherchiez des motifs architecturaux plutôt que des motifs de conception .

Les modèles de conception visent à décrire une «astuce» générale que le programmeur pourrait mettre en œuvre pour gérer un ensemble particulier de tâches logicielles récurrentes. Par exemple: dans la POO, lorsqu'un objet doit notifier un ensemble d'autres objets de certains événements, le modèle de conception d'observateur peut être utilisé.

Étant donné que les applications Android (et la plupart des AOSP) sont écrites en Java, qui est orienté objet, je pense que vous aurez du mal à rechercher un modèle de conception OOP unique qui n'est PAS utilisé sur Android.

Les modèles architecturaux , en revanche, ne traitent pas de tâches logicielles particulières - ils visent à fournir des modèles d'organisation logicielle basés sur les cas d'utilisation du composant logiciel en question.

Cela semble un peu compliqué, mais j'espère qu'un exemple clarifiera: si une application est utilisée pour extraire des données d'un serveur distant et les présenter à l'utilisateur de manière structurée, alors MVC pourrait être un bon candidat à considérer. Notez que je n'ai rien dit sur les tâches logicielles et le déroulement du programme de l'application - je viens de le décrire du point de vue de l'utilisateur, et un candidat pour un modèle architectural a émergé.

Puisque vous avez mentionné MVC dans votre question, je suppose que les modèles architecturaux sont ce que vous recherchez.

Entrez la description de l'image ici


Historiquement, Google n'avait aucune directive officielle sur les architectures des applications, ce qui (entre autres raisons) a conduit à un désordre total dans le code source des applications Android. En fait, même aujourd'hui, la plupart des applications que je vois ne suivent toujours pas les meilleures pratiques de POO et ne montrent pas une organisation logique claire du code.

Mais aujourd'hui, la situation est différente - Google a récemment publié la bibliothèque Data Binding , qui est entièrement intégrée à Android Studio, et a même déployé un ensemble de plans d'architecture pour les applications Android .

Il y a deux ans, il était très difficile de trouver des informations sur MVC ou MVP sur Android. Aujourd'hui, MVC, MVP et MVVM sont devenus des «mots à la mode» dans la communauté Android, et nous sommes entourés d'innombrables experts qui essaient constamment de nous convaincre que MVx est meilleur que MVy. À mon avis, discuter si MVx est meilleur que MVy est totalement inutile parce que les termes eux-mêmes sont très ambigus - regardez simplement les réponses à cette question , et vous vous rendrez compte que différentes personnes peuvent associer ces abréviations à des constructions complètement différentes.

Étant donné que la recherche du meilleur modèle architectural pour Android a officiellement commencé, je pense que nous sommes sur le point de voir plusieurs autres idées apparaître. À ce stade, il est vraiment impossible de prédire quel modèle (ou modèles) deviendra les normes de l'industrie à l'avenir - nous devrons attendre et voir (je suppose que c'est une question d'un an ou deux).

Cependant, il y a une prédiction que je peux faire avec un haut degré de confiance: l'utilisation de la bibliothèque de liaison de données ne deviendra pas une norme de l'industrie. Je suis confiant de le dire parce que la bibliothèque de liaison de données (dans son implémentation actuelle) fournit des gains de productivité à court terme et une sorte de directive architecturale, mais elle rendra le code non maintenable à long terme. Une fois que les effets à long terme de cette bibliothèque feront surface - elle sera abandonnée.


Maintenant, bien que nous ayons une sorte de directives et d'outils officiels aujourd'hui, personnellement, je ne pense pas que ces directives et outils soient les meilleures options disponibles (et ce ne sont certainement pas les seules). Dans mes applications, j'utilise ma propre implémentation d'une architecture MVC. Il est simple, propre, lisible et testable, et ne nécessite aucune bibliothèque supplémentaire.

Ce MVC n'est pas seulement cosmétiquement différent des autres - il est basé sur une théorie selon laquelle les activités dans Android ne sont pas des éléments d'interface utilisateur , ce qui a d'énormes implications sur l'organisation du code.

Donc, si vous cherchez un bon modèle architectural pour les applications Android qui suit les principes SOLID , vous pouvez en trouver une description dans mon article sur les modèles architecturaux MVC et MVP dans Android .

Vasiliy
la source
2
Bravo pour fournir de telles ressources! Merci!
Aleksandar
1
Liens très utiles!
Semaphor
J'aime ton cours vidéo! Merci
Viktor Apoyan
79

entrez la description de l'image ici

Lorsque j'atteins ce poste, cela m'aide vraiment à comprendre les modèles avec l'exemple, donc j'ai fait le tableau ci-dessous pour voir clairement les modèles de conception et leur exemple dans Android Framework

J'espère que vous le trouverez utile.

Peter Walter
la source
4
Veuillez modifier votre message et afficher le contenu réel sous forme de texte au lieu de captures d'écran. D'autres ne peuvent pas copier et coller à partir de vos images ou vous aider à corriger vos fautes de frappe. Voir ici pour plus de détails. Je vous remercie.
Pang
1
Merci pour cette réponse J'étais tellement confus entre les motifs architecturaux et les modèles de conception, j'ai encore une question: qu'est-ce que l'oo-conception et le développement!? @Peter Walter
Rucha Bhatt Joshi
Je vote pour cette réponse car bien que la question de @Burjua mentionne les modèles de conception en se référant aux architectures mais ils ne sont pas les mêmes. Je considère cette réponse très informative et complémentaire à la question d'origine
Xaren
Le bus d'événement utilise le modèle de conception de l'éditeur et de l'abonné
Devrath
48

Il existe différents modèles utilisés dans le cadre Android comme:

  • Le récepteur de diffusion utilise le modèle Observer
  • L'invocation de service à distance utilise un modèle de proxy
  • La vue et le groupe de vues utilisent un motif composite
  • Le cadre multimédia utilise le modèle de façade
yash
la source
5
pouvez-vous s'il vous plaît s'il vous plaît partager les liens (références)
shanraisshan
veuillez partager la référence afin que je puisse en savoir plus. Merci
Syed Hamza Hassan
27

Voici un excellent article sur les modèles de conception communs pour Android :

Modèles de création:

  • Builder (par exemple AlertDialog.Builder )
  • Injection de dépendance (par exemple, poignard 2 )
  • Singleton

Modèles structurels:

  • Adaptateur (par exemple RecyclerView.Adapter )
  • Façade (par ex. Rénovation )

Modèles comportementaux:

  • Commande (par exemple EventBus )
  • Observateur (par exemple RxAndroid )
  • Modèle Vue Contrôleur
  • Vue du modèle ViewModel ( similaire au modèle MVC ci-dessus )
Ineta
la source
1
Les points clés de l'article seraient bien.
Maxim G
Bien que cela puisse théoriquement répondre à la question, il serait préférable d'inclure ici les parties essentielles de la réponse et de fournir le lien de référence.
Bhargav Rao
Le bus d'événement utilise le modèle de conception de l'éditeur et de l'abonné
Devrath
16

Les classes Android suivantes utilisent des modèles de conception

1) Le support de vue utilise le motif de conception Singleton

2) L'intention utilise le modèle de conception d'usine

3) L'adaptateur utilise le modèle de conception de l'adaptateur

4) Le récepteur de diffusion utilise le modèle de conception de l'observateur

5) La vue utilise le modèle de conception composite

6) Media FrameWork utilise le modèle de conception de façade

Jacob Abraham
la source
11

Dans le cas des notifications , le modèle BuilderNotificationCompat.Builder utilise

comme,

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);
Jeff T.
la source
3
Il s'agit en fait du modèle Builder.
Piovezan
@Piovezan je me trompe. Merci de m'avoir corrigé. Je pensais que c'était une version simple de Decorator Pattern.
Jeff T.
6

Android utilise également le modèle de conception ViewHolder.

Il est utilisé pour améliorer les performances d'un ListView tout en le faisant défiler.

Le modèle de conception ViewHolder vous permet d'accéder à chaque vue d'élément de liste sans avoir besoin de la rechercher, ce qui permet d'économiser de précieux cycles de processeur. Plus précisément, cela évite les appels fréquents de findViewById () pendant le défilement de ListView, et cela le rendra fluide.

amarnathpatel
la source
5

Tous ces modèles, MVC, MVVM , MVP et modèle de présentation , peuvent être appliqués aux applications Android, mais sans cadre tiers, il n'est pas facile d'obtenir une structure bien organisée et un code propre.

MVVM provient de PresentationModel. Lorsque nous appliquons MVC, MVVM et le modèle de présentation à une application Android, ce que nous voulons vraiment, c'est avoir un projet structuré clair et, plus important encore, plus facile pour les tests unitaires.

Pour le moment, sans infrastructure tierce, vous avez généralement beaucoup de code (comme addXXListener (), findViewById (), etc.), qui n'ajoute aucune valeur commerciale. De plus, vous devez exécuter des tests unitaires Android au lieu des tests JUnit normaux, qui prennent un certain temps à s'exécuter et rendent les tests unitaires peu pratiques.

Pour ces raisons, il y a quelques années, nous avons lancé un projet open source, RoboBinding - Un cadre de modèle de présentation de liaison de données pour la plate-forme Android. RoboBinding vous aide à écrire du code d'interface utilisateur plus facile à lire, à tester et à maintenir. RoboBinding supprime le besoin de code inutile comme addXXListener ou ainsi , et déplace la logique de l'interface utilisateur vers le modèle de présentation, qui est un POJO et peut être testé via des tests JUnit normaux . RoboBinding lui-même est livré avec plus de 300 tests JUnit pour garantir sa qualité.

Cheng
la source
1

Dans Android, le modèle de «processeur de file d'attente de travail» est couramment utilisé pour décharger les tâches du thread principal d'une application.

Exemple: la conception de la classe IntentService.

IntentService reçoit les intentions, lance un thread de travail et arrête le service comme il convient.Toutes les demandes sont traitées sur un seul thread de travail.

amarnathpatel
la source
0

Binder utilise "Observer Pattern" pour les notifications des destinataires de décès.

Vinodh
la source