Jakie wzorce projektowe są używane na Androidzie? [zamknięte]

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

Np. w iOS Model-view-controller jest bardzo szeroko stosowany wraz z delegacją i innymi wzorami.

Jakich szablonów i gdzie w szczególności używa Android?

EDIT

Nie proszę o wzorce projektowe używane głęboko w kernelu, dalvik i tak dalej, ale o wzorce, które programista aplikacji spotka podczas opracowywania podanie.

Author: Tofeeq, 2011-02-07

12 answers

Próbowałem używać zarówno wzorców projektowych model–view–controller (MVC), jak i wzorców projektowych model–view–presenter do tworzenia Androida. Moje ustalenia są model-widok-kontroler działa dobrze, ale jest kilka "problemów". Wszystko sprowadza się do tego, jak postrzegasz klasę Androida Activity. Czy to kontroler, czy Widok?

Rzeczywista klasa Activity nie rozszerza klasy Androida View, ale jednak obsługuje wyświetlanie okna użytkownikowi, a także obsługuje zdarzenia z to okno (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 użytkownikowi okna z dodatkowymi komponentami widoku, które dodałeś do niego za pomocą setContentView, a także obsługuje zdarzenia przynajmniej dla różnych zdarzeń cyklu życia aktywności.

W MVC kontroler ma być głównym punktem wejścia. Co jest nieco dyskusyjne, Jeśli tak jest w przypadku, gdy zastosowanie go do rozwoju Androida, ponieważ aktywność jest naturalnym punktem wejścia większości aplikacji.

Z tego powodu osobiście uważam, że wzór model–view–presenter idealnie pasuje do rozwoju Androida. Ponieważ rola widoku w tym wzorze wynosi:
  • służy jako punkt wejścia
  • Komponenty renderujące
  • przekierowanie zdarzeń użytkownika do prezentera

To pozwala zaimplementować swój model jak więc:

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

Prezenter - to zajmie się komunikacją między Twoim modelem a Twoim widokiem, spójrz na to jako na bramę do twojego modelu. Oznacza to, że jeśli masz złożony model reprezentujący domenę, Bóg wie co, a twój widok potrzebuje tylko bardzo małego podzbioru tego modelu, zadaniem prezenterów jest odpytywanie modelu, a następnie aktualizacja widoku. Na przykład, jeśli masz model zawierający akapit tekst, nagłówek i liczba słów. Ale w danym widoku wystarczy tylko wyświetlić nagłówek w widoku. Następnie prezenter odczytuje potrzebne dane z modelu i odpowiednio zaktualizuje widok.

Model - powinien to być w zasadzie Twój pełny model domeny. Mam nadzieję, że pomoże to również uczynić model domeny bardziej "ciasnym", ponieważ nie będziesz potrzebował specjalnych metod, aby radzić sobie z przypadkami, jak wspomniano powyżej.

Oddzielając model od widoku wszystkich razem (poprzez korzystanie z prezentera), znacznie bardziej intuicyjne staje się również testowanie modelu. Możesz mieć testy jednostkowe dla modelu domeny i testy jednostkowe dla prezenterów.

Spróbuj. Osobiście uważam, że świetnie pasuje do rozwoju Androida.
 300
Author: JustDanyul,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-04-21 23:54:36

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


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

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

Ponieważ aplikacje na Androida (i większość AOSP) są napisane w Javie, która jest zorientowana obiektowo, myślę, że będziesz miał problem z szukaniem pojedynczego wzorca projektowego OOP, który nie jest używany na Androidzie.

Wzorce architektoniczne z drugiej strony nie dotyczą konkretnych zadań programistycznych - mają na celu dostarczenie szablonów do organizacji oprogramowania w oparciu o przypadki użycia komponentu oprogramowania w pytanie.

Brzmi to trochę skomplikowanie, ale mam nadzieję, że przykład wyjaśni: jeśli jakaś aplikacja będzie używana do pobierania danych ze zdalnego serwera i przedstawiania ich użytkownikowi w ustrukturyzowany sposób, to MVC może być dobrym kandydatem do rozważenia. Zauważ, że nic nie mówiłem o zadaniach programistycznych i przepływie programu aplikacji - po prostu opisałem to z punktu widzenia użytkownika i pojawił się kandydat na wzór architektoniczny.

Skoro wspomniałeś o MVC w swoim pytanie, domyślam się, że wzorce architektoniczne są tym, czego szukasz.

Tutaj wpisz opis obrazka


Historycznie nie było oficjalnych wytycznych Google dotyczących architektur 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 postępują zgodnie z najlepszymi praktykami OOP i nie wykazują wyraźnej logicznej organizacji kodu.

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

Dwa lata temu bardzo trudno było znaleźć informacje o MVC lub MVP na Androida. Dziś MVC, MVP i MVVM stały się" buzz-words " w społeczności Androida, a my jesteśmy otoczeni przez niezliczonych ekspertów, którzy nieustannie próbują nas przekonać, że MVx jest lepszy niż MVy. Moim zdaniem dyskusja to, czy MVx jest lepszy od MVy, jest całkowicie bez sensu, ponieważ same terminy są bardzo niejednoznaczne - wystarczy spojrzeć na odpowiedzi na {46]} to pytanie {7]}, a zdasz sobie sprawę, że różni ludzie mogą kojarzyć te skróty z zupełnie innymi konstrukcjami.

Ze względu na fakt, że poszukiwania najlepszego wzorca architektonicznego dla Androida zostały oficjalnie rozpoczęte, myślę, że wkrótce pojawi się kilka kolejnych pomysłów. W tym momencie jest to naprawdę niemożliwe do przewidzenia który wzór (lub wzory) staną się standardami branżowymi w przyszłości-będziemy musieli poczekać i zobaczyć (myślę, że to kwestia roku lub dwóch).

Jest jednak jedna przepowiednia, którą mogę wykonać z dużym zaufaniem: Korzystanie z biblioteki wiązań danych nie stanie się standardem branżowym. Z pewnością mogę to powiedzieć, ponieważ Biblioteka wiązania danych (w obecnej implementacji) zapewnia krótkoterminowy wzrost wydajności i pewien rodzaj wytycznych architektonicznych, ale sprawi, że Kod niedostępny na dłuższą metę. Gdy pojawią się długoterminowe efekty tej biblioteki - zostanie ona porzucona.


Teraz, chociaż mamy dzisiaj jakieś oficjalne wytyczne i narzędzia, osobiście nie uważam, że te wytyczne i narzędzia są najlepszymi dostępnymi opcjami (i na pewno nie są jedynymi). W moich aplikacjach używam własnej implementacji architektury MVC. Jest prosty, czysty, czytelny i testowalny i nie wymaga żadnych dodatkowych biblioteki.

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

Jeśli więc szukasz dobrego wzorca architektonicznego dla aplikacji na Androida, który jest zgodny z zasadami SOLID , Opis takiego wzorca znajdziesz w moim poście o MVC i MVP wzorcach architektonicznych w Androidzie .

 71
Author: Vasiliy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 10:31:37

Istnieją różne wzory używane w Android framework jak:

  • Odbiornik Broadcast uses Observer pattern
  • wywołanie usługi Remoter używa wzorca Proxy
  • widok i grupa widoku wykorzystuje wzorzec złożony
  • Media framework wykorzystuje wzór elewacji
 43
Author: yash,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-10-31 02:54:52

Tutaj wpisz opis obrazka

Kiedy dotrę do tego posta, to naprawdę pomaga mi zrozumieć wzorce z przykładem, więc mam zrobić poniżej tabeli, aby wyraźnie zobaczyć wzorce projektowe i ich przykład w Android Framework

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

  • kilka przydatnych linków do Referencja:

Https://www.raywenderlich.com/109843/common-design-patterns-for-android

Code.tutsplus.com/articles/introduction-to-android-design-patterns--cms-20808

Https://en.wikipedia.org/wiki/Design_Patterns

 35
Author: Peter Walter,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-10-10 08:52:51

Oto świetny artykuł na temat wspólne wzorce projektowe dla Androida:

Wzory kreacyjne:

  • Builder (np. AlertDialog.Budowniczy )
  • Dependency Injection (np. Dagger 2)
  • Singleton

Wzory strukturalne:

  • Adapter (np. RecyclerView.Adapter )
  • Elewacja (np. modernizacja )

Behawioralne wzory:

  • Command (np. EventBus )
  • Observer (np. RxAndroid)
  • Kontroler Widoku Modelu
  • Model View ViewModel (podobny do wzorca MVC powyżej )
 21
Author: Ineta,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-07-12 21:41:32

Następujące klasy Androida używają wzorców projektowych

1) Uchwyt widoku wykorzystuje wzorzec projektowy Singleton

2) Intencja wykorzystuje wzorzec projektowy fabryki

3) Adapter wykorzystuje wzór projektowy Adaptera

4) Odbiornik Radiowy wykorzystuje wzorzec projektowy obserwatora

5) widok wykorzystuje złożony wzorzec projektowy

6) Media FrameWork wykorzystuje wzorzec projektowy fasady

 15
Author: Jacob Abraham,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-04-16 18:29:40

W przypadku powiadomień , NotificationCompat.Builder używa Builder Pattern

Jak,

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);
 10
Author: Jeff T.,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-09-01 04:43:24

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 potrzeby odszukiwania, oszczędzając cenne cykle procesora. W szczególności unika częstych wywołań funkcji findViewById podczas przewijania ListView, co sprawi, że będzie to płynne.

 5
Author: amarnathpatel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-04-22 00:10:22

Wszystkie te wzorce, MVC, MVVM, MVP i Model prezentacji , mogą być stosowane do aplikacji na Androida, ale bez frameworku innych firm, nie jest łatwo uzyskać dobrze zorganizowaną strukturę i czysty kod.

MVVM pochodzi z PresentationModel. Kiedy zastosujemy MVC, MVVM i Model prezentacji do aplikacji na Androida, tak naprawdę chcemy mieć przejrzysty, zorganizowany projekt i, co ważniejsze, łatwiejszy do testów jednostkowych.

W tej chwili, bez Framework innych firm, zwykle masz dużo kodu (jak addXXListener (), findViewById (), itp.), co nie wnosi żadnej wartości biznesowej. Co więcej, musisz uruchomić testy jednostkowe Androida zamiast normalnych testów JUnit, które trwają wieki, aby uruchomić i zrobić testy jednostkowe nieco niepraktyczne.

Z tych powodów kilka lat temu rozpoczęliśmy projekt open source, RoboBinding - wiążący dane Model prezentacji dla Platformy Android. RoboBinding pomaga w pisaniu kodu UI, który jest łatwiejszy do odczytania, przetestowania i utrzymania. RoboBinding usuwa potrzebę niepotrzebnego kodu, takiego jak addXXListener lub tak, i przenosi logikę interfejsu 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ść.

 4
Author: Cheng,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-04-21 23:58:34

Chciałbym dodać wzorzec projektowy, który został zastosowany w 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

 2
Author: somenath mukhopadhyay,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-12-20 06:18:43

W systemie Android wzór "work queue processor" jest powszechnie używany do odciążania zadań z głównego wątku aplikacji.

Przykład: konstrukcja klasy IntentService.

IntentService odbiera Intenty, uruchamia wątek roboczy i zatrzymuje usługę w razie potrzeby.Wszystkie żądania są obsługiwane w jednym wątku roboczym.

 0
Author: amarnathpatel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-11-07 16:40:08

Binder używa "wzorca obserwatora" dla powiadomień o odbiorcach śmierci.

 0
Author: Vinodh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-08-09 14:51:09