Jakie wzorce architektury są używane w systemie Android? [Zamknięte]

267

Robię małe badania na platformach mobilnych i chciałbym wiedzieć, które wzorce projektowe są używane w Androidzie?

np. w iOS Kontroler widoku modelu jest bardzo szeroko stosowany wraz z delegowaniem i innymi wzorami.

Jakie wzorce i gdzie w szczególności używa Android?

EDYTOWAĆ

Nie pytam o wzorce projektowe używane głęboko w jądrze, Dalviku itp., Ale o wzorce, które programista aplikacji pozna podczas tworzenia aplikacji.

Burjua
źródło
2
Biorąc pod uwagę, że platforma Android zawiera jądro Linuksa, jest to zbyt duży pakiet oprogramowania, aby odpowiedzieć na to pytanie, inne niż „wszystkie wzorce o tej nazwie, i prawdopodobnie kilka nowych, jeśli spojrzysz wystarczająco uważnie”
Pete Kirkham,
4
@Pete, Ok, prawdopodobnie masz rację, ale jednocześnie nie wchodzę tak głęboko jak jądro, interesuje mnie powierzchnia aplikacji, np. W iOS UIViewControllerzaimplementowana przy użyciu MVC ( UIViewControllerjest kontrolerem, a jego rootem UIViewjest widok) , UIApplicationkorzysta z delegacji z delegatem aplikacji jako delegatem i tak dalej ...
Burjua
3
Myślę, że naprawdę powinieneś uczyć się Androida od podstaw i nie próbować „przenosić” swojej wiedzy z iOS na Androida. Istnieje wiele świetnych książek. Apress robi mnóstwo. Jeśli rozumiesz cykl życia aplikacji i usług w Androidzie, powinieneś być w stanie nauczyć się poprawnie projektować aplikacje.
blindstuff,
Może to pomóc: stackoverflow.com/a/49694378
Ali Nem,

Odpowiedzi:

323

Próbowałem używać zarówno wzorców architektonicznych model-widok-kontroler (MVC), jak i model-widok-prezenter do tworzenia aplikacji na Androida. Moje ustalenia są takie, że kontroler widoku modelu działa dobrze, ale jest kilka „problemów”. Wszystko sprowadza się do tego, jak postrzegasz AndroidaActivity klasę . Czy to kontroler, czy widok?

Rzeczywista Activityklasa nie rozszerza Viewklasy Androida , ale obsługuje wyświetlanie okna dla użytkownika, a także obsługuje zdarzenia tego okna (onCreate, onPause itp.).

Oznacza to, że gdy używasz wzorca MVC, twój kontroler będzie w rzeczywistości pseudo kontrolerem widoku. Ponieważ obsługuje wyświetlanie okna dla użytkownika, z dodatkowymi komponentami widoku dodanymi do niego za pomocą setContentView, a także obsługi zdarzeń dla przynajmniej różnych zdarzeń cyklu życia.

W MVC kontroler powinien być głównym punktem wejścia. Co jest nieco dyskusyjne, jeśli tak jest w przypadku zastosowania go do programowania Androida, ponieważ aktywność jest naturalnym punktem wejścia większości aplikacji.

Z tego powodu osobiście uważam, że wzorzec model-widok-prezenter idealnie pasuje do rozwoju Androida. Ponieważ rola widoku w tym wzorze jest:

  • Służy jako punkt wejścia
  • Elementy renderujące
  • Kierowanie zdarzeń użytkownika do prezentera

Pozwala to na wdrożenie modelu w następujący sposób:

Widok - zawiera komponenty interfejsu użytkownika i obsługuje dla nich zdarzenia.

Prezenter - zajmie się komunikacją między Twoim modelem a twoim widokiem, spójrz na to jako brama do twojego modelu. Oznacza to, że jeśli masz złożony model domeny reprezentujący, Bóg wie co, a twój widok potrzebuje tylko bardzo niewielkiej części tego modelu, zadaniem prezentera jest sprawdzenie modelu, a następnie aktualizacja widoku. Na przykład, jeśli masz model zawierający akapit tekstu, nagłówek i liczbę słów. Ale w danym widoku wystarczy wyświetlić nagłówek w widoku. Następnie prezenter odczyta dane potrzebne z modelu i odpowiednio zaktualizuje widok.

Model - powinien to być w zasadzie pełny model domeny. Mamy nadzieję, że pomoże to również uczynić model domeny bardziej „ciasnym”, ponieważ nie będziesz potrzebował specjalnych metod radzenia sobie ze sprawami, jak wspomniano powyżej.

Po oddzieleniu modelu od widoku razem (poprzez użycie prezentera) testowanie modelu staje się znacznie bardziej intuicyjne. Możesz mieć testy jednostkowe dla swojego modelu domeny i testy jednostkowe dla prezenterów.

Wypróbuj to. Osobiście uważam, że doskonale nadaje się do tworzenia Androida.

JustDanyul
źródło
14
Świetna odpowiedź! Mam jednak pytania: 1. Aktywność = Widok, czy mam rację? 2. Czy zaimplementowałbyś prezentera jako własną klasę publiczną, czy jako wewnętrzną klasę działania? A może fragment (także klasa wewnętrzna)? 3. Czy masz na myśli, że klasy przeniesienia będą używane jako zamiast rzeczywistych klas modeli w ćwiczeniu (widok)?
manmal
14
1. Tak, używam ich jako widoków we wzorze MVP. 2. osobiście dzielę je na poszczególne klasy publiczne, ale przypuszczam, że jest to kwestia gustu :) 3. Słabo to wyjaśniłem, zdanie „przekaż potrzebne klasy” jest mylące. Chodzi mi o to, że prezenter siedzi między widokiem a modelem, odczytuje model, a następnie aktualizuje widok. Zaktualizuję moją odpowiedź, aby była nieco bardziej przejrzysta :)
JustDanyul,
dzięki za
poświęcenie
11
Naprawdę uwielbiam programowanie Androida, ponieważ jest ono bardzo oddzielone. Jak korzystam z MVC: Używaj działań wyłącznie do operacji we / wy użytkownika i używaj usługi lokalnej do całego przetwarzania. Gdy serwis chce coś pokazać - transmituj to do swoich działań! Naprawdę nienawidzę tego, gdy inny deweloper wkłada zbyt wiele przetwarzania w działania.
Ktoś gdzieś
8
@SomeoneSomewhere dlaczego nie mieć klasy, która obsługuje te rzeczy w osobnym wątku / AsyncTasks, dlaczego usługa?
Chłopiec
87

Aktualizacja z listopada 2018 r

Po kilku latach pracy i blogowania na temat MVC i MVP w Androidzie (patrz treść odpowiedzi poniżej), postanowiłem zebrać moją wiedzę i zrozumienie w bardziej kompleksowej i łatwo przyswajalnej formie.

Wydałem więc pełny kurs wideo na temat architektury aplikacji na Androida. Jeśli więc chcesz opanować najbardziej zaawansowane wzorce architektoniczne w rozwoju Androida, sprawdź ten kompleksowy kurs tutaj .

Ta odpowiedź została zaktualizowana, aby pozostała aktualna od listopada 2016 r


Wygląda na to, że szukasz wzorów architektonicznych zamiast wzorów .

Wzorce projektowe mają na celu opisanie ogólnej „sztuczki”, którą programista może zastosować do obsługi określonego zestawu powtarzających się zadań programowych. Na przykład: w OOP, gdy istnieje potrzeba, aby obiekt powiadamiał zestaw innych obiektów o niektórych zdarzeniach, można zastosować wzorzec projektowy obserwatora .

Ponieważ aplikacje na Androida (i większość AOSP) są napisane w Javie, która jest zorientowana obiektowo, myślę, że trudno będzie ci znaleźć pojedynczy wzorzec projektowy OOP, który NIE jest używany na Androidzie.

Z drugiej strony wzorce architektoniczne nie odnoszą się do konkretnych zadań oprogramowania - mają na celu dostarczenie szablonów do organizacji oprogramowania na podstawie przypadków użycia danego elementu oprogramowania.

Brzmi to trochę skomplikowanie, ale mam nadzieję, że przykład wyjaśni: jeśli jakaś aplikacja zostanie użyta do pobrania danych ze zdalnego serwera i przedstawienia go użytkownikowi w uporządkowany sposób, to MVC może być dobrym kandydatem do rozważenia. Zauważ, że nie mówiłem nic o zadaniach programowych i przebiegu programu - po prostu opisałem to z punktu widzenia użytkownika i pojawił się kandydat na wzór architektoniczny.

Ponieważ wspomniałeś w swoim pytaniu o MVC, zgaduję, że szukasz wzorów architektonicznych.

Wpisz opis zdjęcia tutaj


Historycznie nie było oficjalnych wytycznych Google dotyczących architektury aplikacji, co (między innymi) doprowadziło do całkowitego bałaganu w kodzie źródłowym aplikacji na Androida. W rzeczywistości nawet dzisiaj większość aplikacji, które widzę, nadal nie przestrzega najlepszych praktyk OOP i nie wykazuje wyraźnej logicznej organizacji kodu.

Ale dziś sytuacja jest inna - Google niedawno wydało bibliotekę Data Binding , która jest w pełni zintegrowana z Android Studio, a nawet wdrożyła zestaw planów architektury dla aplikacji na Androida .

Dwa lata temu bardzo trudno było znaleźć informacje o MVC lub MVP na Androida. Dzisiaj MVC, MVP i MVVM stały się „modnymi słowami” w społeczności Androida, a otaczają nas niezliczeni eksperci, którzy nieustannie próbują nas przekonać, że MVx jest lepszy niż MVy. Moim zdaniem omawianie, czy MVx jest lepszy od MVy, jest całkowicie bezcelowe, ponieważ same terminy są bardzo niejednoznaczne - wystarczy spojrzeć na odpowiedzi na to pytanie , a zdasz sobie sprawę, że różni ludzie mogą kojarzyć te skróty z zupełnie różnymi konstrukcjami.

Ponieważ oficjalnie rozpoczęto poszukiwanie najlepszego wzorca architektonicznego dla Androida, myślę, że wkrótce pojawi się kilka innych pomysłów. W tym momencie naprawdę nie można przewidzieć, który wzorzec (lub wzorce) stanie się standardami branżowymi w przyszłości - musimy poczekać i przekonać się (sądzę, że to kwestia roku lub dwóch).

Istnieje jednak jedna prognoza, którą mogę poczynić z dużym stopniem pewności: użycie biblioteki Data Binding nie stanie się standardem branżowym. Jestem pewien, że mogę to powiedzieć, ponieważ biblioteka Data Binding (w jej bieżącej implementacji) zapewnia krótkoterminowy wzrost wydajności i pewnego rodzaju wytyczne architektoniczne, ale na dłuższą metę sprawi, że kod nie będzie nadawał się do konserwacji. Gdy pojawią się długoterminowe efekty tej biblioteki - zostaną porzucone.


Teraz, chociaż mamy dzisiaj jakieś oficjalne wytyczne i narzędzia, osobiście nie sądzę, aby te wytyczne i narzędzia były najlepszymi dostępnymi opcjami (i zdecydowanie nie są jedynymi). W swoich aplikacjach korzystam z własnej implementacji architektury MVC. Jest prosty, czysty, czytelny i testowany i nie wymaga żadnych dodatkowych bibliotek.

To MVC nie tylko różni się kosmetycznie od innych - opiera się na teorii, że Działania w Androidzie nie są elementami interfejsu użytkownika , co ma ogromne konsekwencje dla organizacji kodu.

Jeśli więc szukasz dobrego wzorca architektonicznego dla aplikacji na Androida zgodnego z zasadami SOLID , możesz znaleźć opis jednego z moich postów na temat wzorców architektonicznych MVC i MVP w Androidzie .

Wasilij
źródło
2
Gratulacje dla zapewnienia takich zasobów! Dzięki!
Aleksandar,
1
Bardzo przydatne linki!
Semafor
Podoba mi się twój kurs wideo! Dzięki
Viktor Apoyan
79

wprowadź opis zdjęcia tutaj

Kiedy docieram do tego postu, naprawdę pomaga mi zrozumieć wzorce z przykładem, więc zrobiłem poniższą tabelę, aby wyraźnie zobaczyć wzorce projektowe i ich przykład w systemie Android

Mam nadzieję, że okaże się to pomocne.

Peter Walter
źródło
3
Proszę edytować swój post i pokazać rzeczywistą zawartość jako tekst zamiast screenów. Inni nie mogą kopiować i wklejać zdjęć ani pomagać w poprawianiu literówek. Zobacz tutaj, aby uzyskać szczegółowe informacje. Dziękuję Ci.
Pang
1
Dziękuję za tę odpowiedź. Byłem tak zdezorientowany między wzorami architektonicznymi a wzorami projektowymi, wciąż mam jedno pytanie, co to jest projektowanie i rozwój oo !? @Peter Walter
Rucha Bhatt Joshi
Głosuję za odpowiedzią, ponieważ chociaż pytanie @ Burjua wspomina o wzorcach projektowych, odnosząc się do architektur, ale nie są one takie same. Uważam tę odpowiedź za bardzo pouczającą i komplementarną do pierwotnego pytania
Xaren,
Magistrala zdarzeń wykorzystuje wzorzec projektowy wydawcy i subskrybenta
Devrath
48

Istnieją różne wzorce używane w systemie Android, takie jak:

  • Odbiornik rozgłoszeniowy wykorzystuje wzorzec obserwatora
  • Wywołanie usługi zdalnej wykorzystuje wzorzec proxy
  • Wyświetl i wyświetl grupę używa wzoru złożonego
  • Struktura multimediów wykorzystuje wzór fasady
yash
źródło
5
czy możesz proszę udostępnić linki (referencje)
shanraisshan
prosimy o udostępnienie referencji, aby uzyskać więcej informacji na ten temat. Dzięki
Syed Hamza Hassan
27

Oto świetny artykuł na temat wspólnych wzorców projektowych dla Androida :

Wzory kreacyjne:

  • Builder (np. AlertDialog.Builder )
  • Wstrzykiwanie zależności (np. Sztylet 2 )
  • Singel

Wzory strukturalne:

  • Adapter (np. RecyclerView.Adapter )
  • Fasada (np. Modernizacja )

Wzorce zachowań:

  • Command (np. EventBus )
  • Obserwator (np. RxAndroid )
  • Kontroler widoku modelu
  • Model View ViewModel ( podobny do wzoru MVC powyżej )
Ineta
źródło
1
Kluczowe punkty z tego artykułu byłyby fajne.
Maxim G
Chociaż teoretycznie może to odpowiedzieć na pytanie, lepiej byłoby zawrzeć tutaj istotne części odpowiedzi i podać odnośnik.
Bhargav Rao
Magistrala zdarzeń wykorzystuje wzorzec projektowy wydawcy i subskrybenta
Devrath
16

Następujące klasy Androida wykorzystują wzorce projektowe

1) View Holder używa wzorca projektowego Singleton

2) Cel wykorzystuje fabryczny wzorzec projektowy

3) Adapter używa wzorca projektowego adaptera

4) Odbiornik transmisji wykorzystuje wzorzec projektowy obserwatora

5) Widok używa wzoru złożonego projektu

6) Media FrameWork wykorzystuje wzór projektowania fasady

Jakub Abraham
źródło
11

W przypadku powiadomieńNotificationCompat.Builder używa wzorca konstruktora

lubić,

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.
źródło
3
To jest właściwie wzorzec Konstruktora.
Piovezan
@Piovezan się mylę. Dziękuję za poprawienie mnie. Myślałem, że to prosta wersja Decoratora.
Jeff T.
6

Android używa również wzorca projektowego ViewHolder.

Służy do poprawy wydajności ListView podczas przewijania.

Wzorzec projektowy ViewHolder umożliwia dostęp do każdego widoku pozycji listy bez konieczności wyszukiwania, oszczędzając cenne cykle procesora. W szczególności unika się częstych wywołań findViewById () podczas przewijania ListView, a to sprawi, że będzie płynne.

amarnathpatel
źródło
5

Wszystkie te wzorce, MVC, MVVM , MVP i Model prezentacji , można zastosować do aplikacji na Androida, ale bez frameworka innej firmy nie jest łatwo uzyskać dobrze zorganizowaną strukturę i czysty kod.

MVVM pochodzi z PresentationModel. Kiedy stosujemy MVC, MVVM i Model prezentacji w aplikacji na Androida, naprawdę chcemy mieć przejrzysty projekt i, co ważniejsze, testy jednostkowe.

W tej chwili, bez frameworka frameworka, zwykle masz dużo kodu (jak addXXListener (), findViewById () itp.), Co nie dodaje żadnej wartości biznesowej. Co więcej, musisz przeprowadzić testy jednostkowe Androida zamiast normalnych testów JUnit, których uruchomienie zajmuje wiele lat i sprawia, że ​​testy jednostkowe są nieco niepraktyczne.

Z tych powodów kilka lat temu rozpoczęliśmy projekt Open Source, RoboBinding - model prezentacyjny wiążący dane dla platformy Android. RoboBinding pomaga pisać kod interfejsu użytkownika, który jest łatwiejszy do odczytania, przetestowania i konserwacji. RoboBinding eliminuje potrzebę niepotrzebnego kodu, takiego jak addXXListener , i przesuwa logikę interfejsu użytkownika do modelu prezentacji, który jest POJO i może być testowany za pomocą normalnych testów JUnit . Sam RoboBinding zawiera ponad 300 testów JUnit, aby zapewnić jego jakość.

Cheng
źródło
1

W Androidzie wzorzec „procesora kolejek roboczych” jest powszechnie używany do odciążania zadań z głównego wątku aplikacji.

Przykład: Projekt klasy IntentService.

Usługa IntentService odbiera intencje, uruchamia wątek roboczy i odpowiednio zatrzymuje usługę. Wszystkie żądania są obsługiwane w jednym wątku roboczym.

amarnathpatel
źródło
0

Binder używa „Wzorca obserwatora” do powiadomień Odbiorcy Śmierci.

Vinodh
źródło