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.
android
design-patterns
Burjua
źródło
źródło
UIViewController
zaimplementowana przy użyciu MVC (UIViewController
jest kontrolerem, a jego rootemUIView
jest widok) ,UIApplication
korzysta z delegacji z delegatem aplikacji jako delegatem i tak dalej ...Odpowiedzi:
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 Androida
Activity
klasę . Czy to kontroler, czy widok?Rzeczywista
Activity
klasa nie rozszerzaView
klasy 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:
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.
źródło
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.
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 .
źródło
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.
Kilka przydatnych linków w celach informacyjnych:
Wprowadzenie do wzorców projektowych Androida
Wzorce projektowe
źródło
Istnieją różne wzorce używane w systemie Android, takie jak:
źródło
Oto świetny artykuł na temat wspólnych wzorców projektowych dla Androida :
Wzory kreacyjne:
Wzory strukturalne:
Wzorce zachowań:
źródło
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
źródło
W przypadku powiadomień
NotificationCompat.Builder
używa wzorca konstruktoralubić,
źródło
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.
źródło
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ść.
źródło
Chciałbym dodać wzorzec projektowy, który został zastosowany w systemie Android Framework. Jest to wzorzec Half Sync Half Async używany w implementacji Asynctask. Zobacz moją dyskusję na
https://docs.google.com/document/d/1_zihWXAwgTAdJc013-bOLUHPMrjeUBZnDuPkzMxEEj0/edit?usp=sharing
źródło
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.
źródło
Binder używa „Wzorca obserwatora” do powiadomień Odbiorcy Śmierci.
źródło