2011-02-06 3 views
206

Я занимаюсь небольшим исследованием мобильных платформ, и я хотел бы узнать, какие шаблоны дизайна используются в Android?Какие шаблоны дизайна используются на Android?

например. в iOS Model-view-controller очень широко используется вместе с делегированием и другими шаблонами.

Какие шаблоны и где, в частности, используется Android?

EDIT

Я не прошу для дизайна шаблонов, используемых в глубине ядра, Dalvik и так далее, но о шаблонах, которые разработчик приложения будут встречаться во время разработки приложения.

+2

Учитывая, что платформа Android включает ядро ​​Linux, это слишком большой набор программ для ответа на этот вопрос, кроме «всех шаблонов, названных до сих пор, и, возможно, нескольких новых, если вы достаточно внимательно смотрите» –

+3

@Pete , Ок, возможно, вы правы, но в то же время я не так глубоко, как ядро, меня интересует поверхность приложения, например в iOS 'UIViewController', реализованном с использованием MVC (' UIViewController' является контроллером, а его корневой 'UIView' является представлением),' UIApplication' использует делегирование, имеющее делегат приложения в качестве делегата и т. д. ... – Burjua

+3

Думаю, вам действительно нужно научиться Android из снизу вверх и не пытайтесь «переносить» свои знания с iOS на Android. Там много замечательных книг. Апресс делает кучу. Если вы понимаете жизненный цикл приложения и службы в android, вы должны иметь возможность правильно определять приложения. – blindstuff

ответ

285

Я попытался использовать шаблоны дизайна model–view–controller (MVC) и model–view–presenter для разработки Android. Мои результаты - это модель-контроллер-просмотр, отлично работает, но есть пара «проблем». Все сводится к тому, как вы воспринимаете класс Android Activity. Является ли это контроллером, или это вид?

Фактический класс Activity не расширяет класс Android View, но он, однако, обрабатывает отображение окна пользователю, а также обрабатывает события этого окна (onCreate, onPause и т. Д.).

Это означает, что, когда вы используете шаблон MVC, ваш контроллер будет на самом деле быть псевдо-контроллером. Поскольку это обработка отображения окна пользователю, с дополнительными компонентами представления, которые вы добавили к нему с помощью setContentView, а также обработки событий, по крайней мере, для различных событий жизненного цикла активности.

В MVC контроллер должен быть основной точкой входа. Что немного спорно, если это имеет место при применении его в развитие Android, поскольку активность является естественной отправной точкой для большинства приложений.

Из-за этого я лично считаю, что модель model-view-presenter идеально подходит для разработки Android. Поскольку роль мнения, в этой модели является:

  • Обслуживания в качестве точки входа
  • компоненте Rendering
  • маршрутизации пользовательских событий предъявителя

Это позволяет реализовать модель как так:

View - здесь содержатся компоненты пользовательского интерфейса и обрабатываются события для них.

Презентатор - это будет поддерживать связь между вашей моделью и вашим представлением, посмотрите на нее как на шлюз вашей модели. Значение, если у вас есть сложная модель домена, представляющая, Бог знает, что, и вашему представлению требуется только очень небольшое подмножество этой модели, задание докладчиков заключается в том, чтобы запросить модель и затем обновить представление. Например, если у вас есть модель, содержащая абзац текста, заголовок и число слов. Но в данном представлении вам нужно отобразить заголовок в представлении. Затем ведущий будет считывать данные, необходимые для модели, и соответственно обновлять представление.

Модель - это в основном ваша модель полного домена.Надеюсь, это поможет сделать вашу модель домена более «плотной», так как вам не понадобятся специальные методы для рассмотрения случаев, упомянутых выше.

Отделив модель от вида все вместе (через использование презентатора), он также станет намного более интуитивным, чтобы протестировать вашу модель. У вас могут быть модульные тесты для вашей модели домена и модульные тесты для ваших докладчиков.

Попробуйте. Я лично считаю, что это отлично подходит для разработки Android.

+12

Отличный ответ! У меня есть вопросы: 1. Activity = View, правильно ли я это понял? 2. Внедрили ли вы презентатора в качестве своего собственного публичного класса или как внутренний класс Activity? Или фрагмент (также внутренний класс)? 3. Вы имеете в виду, что классы переноса должны использоваться вместо реальных классов модели в Activity (view)? – manmal

+12

1. Да, я использую их как виды в шаблоне MVP. 2. лично, я разделяю их на отдельные публичные классы, но это вопрос вкуса, который я предполагаю :) 3. Я объяснил это довольно плохо, предложение «переслать необходимые классы» вводит в заблуждение. Я имею в виду, что ведущий находится между представлением и моделью, он читает модель и затем обновляет представление. Я уточню свой ответ, чтобы быть немного более ясным :) – JustDanyul

+0

спасибо, что нашли время, я получаю его сейчас :) – manmal

38

Существуют различные модели, используемые в Android рамке, как:

  • радиовещательного приемник использует Паттерн наблюдателя
  • Remoter вызова службы использует прокси-шаблон
  • Просмотр и вид группа используют композитный шаблон
  • Media Framework польз Фасадная диаграмма
+4

Не могли бы вы, пожалуйста, поделитесь ссылками (ссылками) – shanraisshan

+0

, пожалуйста, поделитесь ссылкой, чтобы я мог больше узнать об этом. Спасибо –

3

Всех эти узоры, MVC, MVVM, MVP и Presentation Model, может быть применен к Android приложений, но без рамки третьей стороны, это не так легко получить хорошо организованными структуры и чистого кода.

MVVM основан на представленииModel. Когда мы применяем MVC, MVVM и Presentation Model к Android-приложению, мы действительно хотим иметь четкий структурированный проект и, что еще более важно, для модульных тестов.

В настоящий момент, без сторонней структуры, у вас обычно есть много кода (например, addXXListener(), findViewById() и т. Д.), Который не добавляет никакого бизнес-значения. Более того, вам нужно запускать тесты на устройства Android вместо обычных тестов JUnit, которые требуют времени для запуска и делают блок-тесты несколько непрактичными.

По этим причинам несколько лет назад мы начали проект с открытым исходным кодом, RoboBinding - Основа для представления данных для платформы Android. RoboBinding помогает вам писать код пользовательского интерфейса, который легче читать, тестировать и поддерживать. RoboBinding устраняет необходимость ненужного кода, например addXXListener или так, и сдвигает логику пользовательского интерфейса на модель представления, которая является POJO и может быть протестирована с помощью обычных тестов JUnit. RoboBinding поставляется с более чем 300 тестов JUnit для обеспечения его качества.

4

Android также использует шаблон дизайна ViewHolder.

Он используется для улучшения производительности ListView при прокрутке.

Шаблон проектирования ViewHolder позволяет получить доступ к каждому элементу списка элементов без необходимости поиска, экономя ценные циклы процессора. В частности, это позволяет избежать частых вызовов findViewById() во время прокрутки ListView, и это сделает его гладким.

63

Этот ответ был обновлен для того, чтобы оставаться актуальной по состоянию на ноябрь 2016 года


Похоже, что вы ищете для architectural patterns, а не design patterns.

Шаблоны проектирования предназначены для описания общего «трюка», который программист может реализовать для обработки определенного набора повторяющихся задач программного обеспечения. Например: В ООП, когда необходимо, чтобы объект уведомлял набор других объектов о некоторых событиях, может использоваться observer design pattern.

Поскольку приложения Android (и большая часть AOSP) написаны на Java, объектно-ориентированной, я думаю, вам будет трудно найти один шаблон проектирования ООП, который НЕ используется на Android.

Архитектурные модели, с другой стороны, не решают конкретные задачи программного обеспечения - они направлены на обеспечение шаблонов для организации программного обеспечения на основе прецедентах компоненты программного обеспечения в вопросе.

Это звучит немного сложно, но я надеюсь, что пример пояснит: если какое-то приложение будет использоваться для извлечения данных с удаленного сервера и представить его пользователю структурированным образом, то MVC может быть хорошим кандидатом для рассмотрение. Обратите внимание, что я ничего не сказал о задачах программного обеспечения и потоке программ приложения - я только что описал его с точки зрения пользователя, и появился кандидат на архитектурный шаблон.

Поскольку вы упомянули MVC в своем вопросе, я бы предположил, что архитектурные шаблоны - это то, что вы ищете.

Enter image description here


Исторически, не было никаких официальных руководящих принципов по Google об архитектуре приложений, которые (наряду с другими причинами) привели к полной неразберихи в исходном коде Android приложений. Фактически, даже сегодня большинство приложений, которые я вижу, по-прежнему не соответствуют лучшим методам ООП и не показывают четкой логической организации кода.

Но сегодня ситуация другая: Google недавно выпустил Data Binding library, который полностью интегрирован с Android Studio и даже выпустил набор из architecture blueprints for Android applications.

Два года назад было очень сложно найти информацию о MVC или MVP на Android. Сегодня MVC, MVP и MVVM стали «гудкими словами» в сообществе Android, и нас окружают бесчисленные эксперты, которые постоянно пытаются убедить нас, что MVx лучше MVy. На мой взгляд, обсуждение того, является ли MVx лучше MVy, совершенно бессмысленно, потому что сами термины очень неоднозначны - просто посмотрите ответы на this question, и вы поймете, что разные люди могут связывать эти аббревиатуры с совершенно разными конструкциями.

В связи с тем, что поиск наилучшего архитектурного образца для Android официально начался, я думаю, что мы собираемся увидеть еще несколько идей. На данный момент невозможно предсказать, какой шаблон (или шаблоны) станет в будущем отраслевыми стандартами - нам нужно будет подождать и посмотреть (я думаю, это вопрос года или двух).

Однако есть одно предсказание, которое я могу сделать с высокой степенью уверенности: использование библиотеки привязки данных не станет отраслевым стандартом. Я уверен, что это потому, что библиотека привязки данных (в ее текущей реализации) обеспечивает кратковременную прирост производительности и своеобразный архитектурный ориентир, но в конечном итоге это сделает код не поддерживаемым. Как только долгосрочные эффекты этой библиотеки окажутся на поверхности - она ​​будет оставлена.


Теперь, хотя у нас есть какие-то официальные руководящие принципы и инструменты сегодня, я, лично, не думаю, что эти принципы и инструменты лучшие варианты (и они, безусловно, не единственные) , В моих приложениях я использую собственную реализацию архитектуры MVC. Он прост, чист, читабельен и проверен и не требует дополнительных библиотек.

Этот MVC не просто косметически отличается от других - он основан на теории, что Activities in Android are not UI Elements, что имеет огромные последствия для организации кода.

Итак, если вы ищете хороший архитектурный образец для приложений для Android, который следует принципам SOLID, вы можете найти описание одного из них в своем посте около MVC and MVP architectural patterns in Android.

+1

Хорошо сделано для предоставления таких ресурсов! Благодаря! – Aleksandar

+1

Очень полезные ссылки! – Semaphor

8

В Notifications случае NotificationCompat.Builder использует Builder Pattern

как,

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); 
+2

Это на самом деле шаблон Builder. – Piovezan

+0

@Piovezan Я ошибаюсь. Спасибо, что исправил меня. Я подумал, что это простая версия Decorator Pattern. –

0

В Android "процессор очереди работы" модель обычно используется для выгрузки задач из основного потока приложения.

Пример: дизайн класса IntentService.

IntentService получает намерения, запускает рабочий поток и останавливает службу по мере необходимости. Все запросы обрабатываются на одном рабочем потоке.

15

Следующие Android классов использует Design Patterns

1) Вид футляра использует Singleton Design Pattern

2) Намерение использует Factory Design Pattern

3) Адаптер использует адаптер Design Pattern

4) Широковещательный приемник использует шаблон проектирования наблюдателя

5) Просмотр использует составной шаблон проектирования

6) Media Framework использует Фасадная Design Pattern

18

Вот большая статья на Common Design Patterns for Android:

Порождающие модели:

  • Builder (например, AlertDialog.Builder)
  • Инъекция зависимостей (например,Кинжал 2)
  • Синглтон

Структурные модели:

  • адаптер (например RecyclerView.Adapter)
  • Фасад (например Ретрофит)

Поведенческие модели:

  • команд (например, EventBus)
  • наблюдатель (например RxAndroid)
  • Model View Controller
  • Model View ViewModel (похож на шаблон MVC выше)
+1

Ключевыми моментами из статьи было бы хорошо. –

+0

Хотя это теоретически может ответить на вопрос, [было бы предпочтительнее] (// meta.stackoverflow.com/q/8259) включить сюда основные части ответа и предоставить ссылку для справки. –

0

Binder использует "Наблюдатель Pattern" для смерти Уведомления получателей.

16

enter image description here

Когда я достичь этой должности он действительно помочь мне понять паттерны с примера, так что я бы сделать таблицу ниже, чтобы ясно видеть образцы дизайна & их пример в Android Framework

Я надеюсь, что вы найдете это полезно.

+1

Пожалуйста, ** [изменить] ** ваш пост и показывать фактический контент как текст вместо скриншотов. Другие не могут копировать и вставлять ваши изображения или помогать вам в настройке опечаток. [См. Здесь] (https://meta.stackoverflow.com/a/285557/1402846). Спасибо. – Pang

Смежные вопросы