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.
android
design-patterns
Burjua
quelle
quelle
UIViewController
das mit MVC implementiert wurde (UIViewController
ist ein Controller und sein StammUIView
ist die Ansicht). ,UIApplication
verwendet Delegation mit Application Delegate als Delegat und so weiter ...Antworten:
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-
Activity
Klasse wahrnehmen . Ist es ein Controller oder eine Ansicht?Die eigentliche
Activity
Klasse erweitert nicht die Android-View
Klasse, 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:
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.
quelle
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.
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 .
quelle
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.
Einige nützliche Links als Referenz:
Einführung in Android Design Patterns
Designmuster
quelle
Im Android-Framework werden verschiedene Muster verwendet:
quelle
Hier ist ein großartiger Artikel über Common Design Patterns für Android :
Schöpfungsmuster:
Strukturmuster:
Verhaltensmuster:
quelle
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
quelle
Im Benachrichtigungen Fall der
NotificationCompat.Builder
verwendet Builder Patternmögen,
quelle
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.
quelle
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.
quelle
Ich möchte ein Entwurfsmuster hinzufügen, das in Android Framework angewendet wurde. Dies ist das Half Sync Half Async-Muster, das in der Asynctask-Implementierung verwendet wird. Siehe meine Diskussion unter
https://docs.google.com/document/d/1_zihWXAwgTAdJc013-bOLUHPMrjeUBZnDuPkzMxEEj0/edit?usp=sharing
quelle
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.
quelle
Binder verwendet "Observer Pattern" für Benachrichtigungen von Todesempfängern.
quelle