Welche Architekturmuster werden unter Android verwendet? [geschlossen]

267

Ich recherchiere ein wenig über mobile Plattformen und möchte wissen, welche Designmuster in Android verwendet werden.

zB in iOS wird Model-View-Controller zusammen mit Delegierung und anderen Mustern sehr häufig verwendet.

Welche Muster und wo verwendet Android insbesondere?

BEARBEITEN

Ich frage nicht nach Entwurfsmustern, die tief im Kernel, Dalvik usw. verwendet werden, sondern nach Mustern, die ein Anwendungsentwickler beim Entwickeln einer Anwendung treffen wird.

Burjua
quelle
2
Angesichts der Tatsache, dass die Android-Plattform einen Linux-Kernel enthält, ist die Software viel zu groß, um diese Frage zu beantworten, abgesehen von "allen bisher genannten Mustern und wahrscheinlich ein paar neuen, wenn Sie genau hinschauen"
Pete Kirkham,
4
@Pete, Ok, wahrscheinlich hast du recht, aber gleichzeitig bin ich nicht so tief wie der Kernel, ich interessiere mich für die Oberfläche der Anwendung, z. B. für iOS, UIViewControllerdas mit MVC implementiert wurde ( UIViewControllerist ein Controller und sein Stamm UIViewist die Ansicht). , UIApplicationverwendet Delegation mit Application Delegate als Delegat und so weiter ...
Burjua
3
Ich denke, Sie sollten Android wirklich von Grund auf lernen und nicht versuchen, Ihr Wissen von iOS auf Android zu "portieren". Es gibt viele großartige Bücher da draußen. Apress macht einen Haufen. Wenn Sie den App- und Service-Lebenszyklus in Android verstehen, sollten Sie in der Lage sein, Apps richtig zu gestalten.
Blindstuff
Dies könnte helfen: stackoverflow.com/a/49694378
Ali Nem

Antworten:

323

Ich habe versucht, sowohl das Model-View-Controller (MVC) als auch das Model-View-Presenter- Architekturmuster für die Android-Entwicklung zu verwenden. Meine Ergebnisse sind, dass Model-View-Controller gut funktioniert, aber es gibt ein paar "Probleme". Es kommt darauf an, wie Sie die Android- ActivityKlasse wahrnehmen . Ist es ein Controller oder eine Ansicht?

Die eigentliche ActivityKlasse erweitert nicht die Android- ViewKlasse, behandelt jedoch die Anzeige eines Fensters für den Benutzer und auch die Ereignisse dieses Fensters (onCreate, onPause usw.).

Dies bedeutet, dass Ihr Controller bei Verwendung eines MVC-Musters tatsächlich ein Pseudo-View-Controller ist. Da es darum geht, dem Benutzer ein Fenster anzuzeigen, mit den zusätzlichen Ansichtskomponenten, die Sie mit setContentView hinzugefügt haben, und auch Ereignisse für mindestens die verschiedenen Aktivitätslebenszyklusereignisse zu behandeln.

In MVC soll der Controller der Haupteinstiegspunkt sein. Was ein wenig umstritten ist, wenn dies bei der Anwendung auf die Android-Entwicklung der Fall ist, da die Aktivität der natürliche Einstiegspunkt der meisten Anwendungen ist.

Aus diesem Grund finde ich persönlich, dass das Modell-Ansicht-Präsentator- Muster perfekt für die Android-Entwicklung geeignet ist. Da die Rolle der Ansicht in diesem Muster ist:

  • Als Einstiegspunkt dienen
  • Komponenten rendern
  • Weiterleiten von Benutzerereignissen an den Präsentator

Auf diese Weise können Sie Ihr Modell folgendermaßen implementieren:

Ansicht - Diese enthält Ihre UI-Komponenten und behandelt Ereignisse für diese.

Presenter - Hiermit wird die Kommunikation zwischen Ihrem Modell und Ihrer Ansicht verwaltet. Betrachten Sie sie als Gateway zu Ihrem Modell. Das heißt, wenn Sie ein komplexes Domänenmodell haben, das darstellt, Gott weiß was, und Ihre Ansicht nur eine sehr kleine Teilmenge dieses Modells benötigt, besteht die Aufgabe des Präsentators darin, das Modell abzufragen und dann die Ansicht zu aktualisieren. Wenn Sie beispielsweise ein Modell haben, das einen Textabsatz, eine Überschrift und eine Wortzahl enthält. In einer bestimmten Ansicht müssen Sie jedoch nur die Überschrift in der Ansicht anzeigen. Anschließend liest der Präsentator die vom Modell benötigten Daten und aktualisiert die Ansicht entsprechend.

Modell - Dies sollte im Grunde Ihr vollständiges Domain-Modell sein. Hoffentlich hilft es auch dabei, Ihr Domain-Modell "straffer" zu machen, da Sie keine speziellen Methoden benötigen, um die oben genannten Fälle zu behandeln.

Durch das Entkoppeln des Modells von der Ansicht insgesamt (mithilfe des Präsentators) wird es auch viel intuitiver, Ihr Modell zu testen. Sie können Unit-Tests für Ihr Domain-Modell und Unit-Tests für Ihre Präsentatoren durchführen.

Versuch es. Ich persönlich finde es sehr gut für die Android-Entwicklung geeignet.

JustDanyul
quelle
14
Gute Antwort! Ich habe jedoch Fragen: 1. Aktivität = Anzeigen, habe ich das richtig verstanden? 2. Würden Sie den Präsentator als eigene öffentliche Klasse oder als innere Klasse der Aktivität implementieren? Oder ein Fragment (auch innere Klasse)? 3. Meinen Sie, dass Übertragungsklassen anstelle der tatsächlichen Modellklassen in der Aktivität (Ansicht) verwendet werden sollen?
Manmal
14
1. Ja, ich verwende sie als Ansichten innerhalb des MVP-Musters. 2. Ich persönlich teile sie in einzelne öffentliche Klassen ein, aber das ist wohl Geschmackssache :) 3. Ich habe das ziemlich schlecht erklärt, der Satz "die benötigten Klassen weiterleiten" ist irreführend. Ich meine, der Präsentator sitzt zwischen der Ansicht und dem Modell, liest das Modell und aktualisiert dann die Ansicht. Ich werde meine Antwort aktualisieren, um ein bisschen klarer zu sein :)
JustDanyul
Danke, dass
du dir
11
Ich liebe die Android-Entwicklung wirklich, weil sie stark entkoppelt ist. So verwende ich MVC: Verwenden Sie Aktivitäten nur für Benutzer-E / A und einen lokalen Dienst für Ihre gesamte Verarbeitung. Wenn der Dienst etwas zeigen möchte - senden Sie es an Ihre Aktivitäten! Ich hasse es wirklich, wenn andere Entwickler viel zu viel Verarbeitung in Aktivitäten stecken.
Jemand irgendwo
8
@SomeoneSomewhere, warum nicht eine Klasse, die dieses Zeug in einem separaten Thread / AsyncTasks behandelt, warum ein Dienst?
Junge
87

Update November 2018

Nachdem ich einige Jahre über MVC und MVP in Android gearbeitet und gebloggt hatte (siehe Antwort unten), beschloss ich, mein Wissen und Verständnis in einer umfassenderen und leicht verdaulichen Form zu erfassen.

Also habe ich einen vollständigen Videokurs über die Architektur von Android-Anwendungen veröffentlicht. Wenn Sie also die fortschrittlichsten Architekturmuster in der Android-Entwicklung beherrschen möchten, lesen Sie diesen umfassenden Kurs hier .

Diese Antwort wurde aktualisiert, um ab November 2016 relevant zu bleiben


Es sieht so aus, als würden Sie eher nach Architekturmustern als nach Entwurfsmustern suchen .

Entwurfsmuster zielen darauf ab, einen allgemeinen "Trick" zu beschreiben, den der Programmierer zur Behandlung eines bestimmten Satzes wiederkehrender Softwareaufgaben implementieren kann. Beispiel: In OOP kann das Beobachterentwurfsmuster verwendet werden , wenn ein Objekt eine Reihe anderer Objekte über bestimmte Ereignisse benachrichtigen muss.

Da Android-Anwendungen (und die meisten AOSP-Anwendungen) in Java geschrieben sind, das objektorientiert ist, fällt es Ihnen wahrscheinlich schwer, nach einem einzigen OOP-Entwurfsmuster zu suchen, das unter Android NICHT verwendet wird.

Architekturmuster hingegen adressieren keine bestimmten Softwareaufgaben - sie zielen darauf ab, Vorlagen für die Softwareorganisation basierend auf den Anwendungsfällen der betreffenden Softwarekomponente bereitzustellen .

Es klingt ein bisschen kompliziert, aber ich hoffe, ein Beispiel wird klarstellen: Wenn eine Anwendung verwendet wird, um Daten von einem Remote-Server abzurufen und dem Benutzer strukturiert zu präsentieren, ist MVC möglicherweise ein guter Kandidat für eine Prüfung. Beachten Sie, dass ich nichts über Softwareaufgaben und den Programmablauf der Anwendung gesagt habe - ich habe es nur aus Anwendersicht beschrieben, und es ist ein Kandidat für ein Architekturmuster aufgetaucht.

Da Sie MVC in Ihrer Frage erwähnt haben, würde ich vermuten, dass Sie nach Architekturmustern suchen.

Geben Sie hier die Bildbeschreibung ein


In der Vergangenheit gab es keine offiziellen Richtlinien von Google zu den Architekturen von Anwendungen, was (unter anderem) zu einem völligen Durcheinander im Quellcode von Android-Apps führte. Tatsächlich folgen die meisten Anwendungen, die ich sehe, auch heute noch nicht den Best Practices von OOP und zeigen keine klare logische Organisation des Codes.

Heute ist die Situation jedoch anders: Google hat kürzlich die Datenbindungsbibliothek veröffentlicht , die vollständig in Android Studio integriert ist, und sogar eine Reihe von Architekturentwürfen für Android-Anwendungen eingeführt .

Vor zwei Jahren war es sehr schwierig, Informationen über MVC oder MVP auf Android zu finden. Heute sind MVC, MVP und MVVM in der Android-Community zu "Modewörtern" geworden, und wir sind von unzähligen Experten umgeben, die ständig versuchen, uns davon zu überzeugen, dass MVx besser ist als MVy. Meiner Meinung nach ist es völlig sinnlos zu diskutieren, ob MVx besser als MVy ist, da die Begriffe selbst sehr vieldeutig sind. Schauen Sie sich einfach die Antworten auf diese Frage an und Sie werden feststellen, dass verschiedene Personen diese Abkürzungen mit völlig unterschiedlichen Konstrukten assoziieren können.

Aufgrund der Tatsache, dass offiziell nach einem besten Architekturmuster für Android gesucht wurde, werden meiner Meinung nach weitere Ideen zutage treten. Zu diesem Zeitpunkt ist es wirklich unmöglich vorherzusagen, welches Muster (oder welche Muster) in Zukunft zu Industriestandards werden wird - wir müssen abwarten (ich denke, es ist eine Frage von ein oder zwei Jahren).

Es gibt jedoch eine Vorhersage, die ich mit einem hohen Maß an Sicherheit treffen kann: Die Verwendung der Datenbindungsbibliothek wird nicht zum Industriestandard. Ich bin zuversichtlich, dies zu sagen, da die Datenbindungsbibliothek (in ihrer aktuellen Implementierung) kurzfristige Produktivitätssteigerungen und eine Art Architekturrichtlinie bietet, aber den Code auf lange Sicht nicht wartbar macht. Sobald Langzeiteffekte dieser Bibliothek auftauchen, wird sie aufgegeben.


Obwohl wir heute offizielle Richtlinien und Tools haben, denke ich persönlich nicht, dass diese Richtlinien und Tools die besten verfügbaren Optionen sind (und sie sind definitiv nicht die einzigen). In meinen Anwendungen verwende ich meine eigene Implementierung einer MVC-Architektur. Es ist einfach, sauber, lesbar und testbar und erfordert keine zusätzlichen Bibliotheken.

Diese MVC unterscheidet sich nicht nur kosmetisch von anderen - sie basiert auf der Theorie, dass Aktivitäten in Android keine UI-Elemente sind , was enorme Auswirkungen auf die Code-Organisation hat.

Wenn Sie also nach einem guten Architekturmuster für Android-Anwendungen suchen , das den SOLID- Prinzipien folgt , finden Sie in meinem Beitrag eine Beschreibung zu MVC- und MVP-Architekturmustern in Android .

Vasiliy
quelle
2
Gut gemacht für die Bereitstellung solcher Ressourcen! Vielen Dank!
Aleksandar
1
Sehr nützliche Links!
Semaphor
Ich mag deinen Videokurs! Danke
Viktor Apoyan
79

Geben Sie hier die Bildbeschreibung ein

Wenn ich diesen Beitrag erreiche, hilft es mir wirklich, Muster anhand eines Beispiels zu verstehen. Daher habe ich die folgende Tabelle erstellt, um die Entwurfsmuster und ihr Beispiel in Android Framework klar zu sehen

Ich hoffe, Sie finden es hilfreich.

Peter Walter
quelle
3
Bitte bearbeiten Sie Ihren Beitrag und zeigen Sie den tatsächlichen Inhalt als Text anstelle von Screenshots an. Andere können Ihre Bilder nicht kopieren und einfügen oder Ihnen helfen, Ihre Tippfehler zu beheben. Siehe hier für Details. Danke dir.
Pang
1
Vielen Dank für diese Antwort. Ich war so verwirrt zwischen Architekturmustern und Designmustern, dass ich noch eine Frage habe: Was ist OO-Design und Entwicklung? @ Peter Walter
Rucha Bhatt Joshi
Ich stimme dieser Antwort zu, weil in der Frage von @Burjua zwar Entwurfsmuster durch Bezugnahme auf Architekturen erwähnt werden, diese aber nicht gleich sind. Ich halte diese Antwort für sehr informativ und ergänzend zur ursprünglichen Frage
Xaren
Event Bus verwendet Publisher und Subscriber Design Pattern
Devrath
48

Im Android-Framework werden verschiedene Muster verwendet:

  • Der Rundfunkempfänger verwendet das Beobachtermuster
  • Der Aufruf des Remoter-Dienstes verwendet das Proxy-Muster
  • Ansicht und Ansichtsgruppe verwenden zusammengesetztes Muster
  • Das Medienframework verwendet das Fassadenmuster
yash
quelle
5
können Sie bitte bitte teilen Sie die Links (Referenzen)
Shanraisshan
Bitte teilen Sie die Referenz, damit ich mehr darüber finden kann. Vielen Dank
Syed Hamza Hassan
27

Hier ist ein großartiger Artikel über Common Design Patterns für Android :

Schöpfungsmuster:

  • Builder (zB AlertDialog.Builder )
  • Abhängigkeitsinjektion (zB Dolch 2 )
  • Singleton

Strukturmuster:

  • Adapter (zB RecyclerView.Adapter )
  • Fassade (zB Nachrüstung )

Verhaltensmuster:

  • Befehl (zB EventBus )
  • Beobachter (zB RxAndroid )
  • Model View Controller
  • Modellansicht ViewModel ( ähnlich dem obigen MVC-Muster )
Ineta
quelle
1
Wichtige Punkte aus dem Artikel wären schön.
Maxim G
Während dies theoretisch die Frage beantworten kann, wäre es vorzuziehen , die wesentlichen Teile der Antwort hier aufzunehmen und den Link als Referenz bereitzustellen.
Bhargav Rao
Event Bus verwendet Publisher und Subscriber Design Pattern
Devrath
16

Die folgenden Android-Klassen verwenden Entwurfsmuster

1) Der Ansichtsinhaber verwendet das Singleton-Entwurfsmuster

2) Absicht verwendet Factory Design Pattern

3) Der Adapter verwendet das Adapter-Entwurfsmuster

4) Der Rundfunkempfänger verwendet das Observer Design Pattern

5) Ansicht verwendet zusammengesetztes Entwurfsmuster

6) Media FrameWork verwendet das Fassadengestaltungsmuster

Jacob Abraham
quelle
11

Im Benachrichtigungen Fall der NotificationCompat.Builderverwendet Builder Pattern

mögen,

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.
quelle
3
Dies ist eigentlich das Builder-Muster.
Piovezan
@Piovezan Ich liege falsch. Danke, dass du mich korrigiert hast. Ich dachte, es ist eine einfache Version von Decorator Pattern.
Jeff T.
6

Android verwendet auch das ViewHolder-Entwurfsmuster.

Es wird verwendet, um die Leistung einer ListView beim Scrollen zu verbessern.

Mit dem ViewHolder-Entwurfsmuster können Sie auf jede Listenelementansicht zugreifen, ohne nachschlagen zu müssen, und so wertvolle Prozessorzyklen sparen. Insbesondere werden häufige Aufrufe von findViewById () während des ListView-Bildlaufs vermieden, und dies macht es reibungslos.

Amarnathpatel
quelle
5

Alle diese Muster, MVC, MVVM , MVP und Präsentationsmodell , können auf Android-Apps angewendet werden. Ohne ein Framework von Drittanbietern ist es jedoch nicht einfach, eine gut organisierte Struktur und sauberen Code zu erhalten.

MVVM stammt von PresentationModel. Wenn wir MVC, MVVM und Präsentationsmodell anwenden auf eine Android-App möchten wir wirklich ein klar strukturiertes Projekt und vor allem einfacher für Unit-Tests.

Derzeit verfügen Sie ohne ein Framework eines Drittanbieters normalerweise über viel Code (wie addXXListener (), findViewById () usw.), der keinen geschäftlichen Mehrwert bietet. Darüber hinaus müssen Sie Android-Unit-Tests anstelle von normalen JUnit-Tests ausführen, deren Ausführung ewig dauert und Unit-Tests etwas unpraktisch macht.

Aus diesen Gründen haben wir vor einigen Jahren ein Open-Source-Projekt gestartet, RoboBinding - Ein datenbindendes Präsentationsmodell-Framework für die Android-Plattform. Mit RoboBinding können Sie UI-Code schreiben, der einfacher zu lesen, zu testen und zu warten ist. RoboBinding macht unnötigen Code wie addXXListener oder so überflüssig und verschiebt die UI-Logik auf das Präsentationsmodell, das ein POJO ist und über normale JUnit-Tests getestet werden kann . RoboBinding selbst wird mit mehr als 300 JUnit-Tests geliefert, um seine Qualität sicherzustellen.

Cheng
quelle
1

In Android wird das Muster "Work Queue Processor" häufig verwendet, um Aufgaben aus dem Hauptthread einer Anwendung zu entfernen.

Beispiel: Das Design der IntentService-Klasse.

Der IntentService empfängt die Absichten, startet einen Arbeitsthread und stoppt den Dienst entsprechend. Alle Anforderungen werden in einem einzelnen Arbeitsthread behandelt.

Amarnathpatel
quelle
0

Binder verwendet "Observer Pattern" für Benachrichtigungen von Todesempfängern.

Vinodh
quelle