У меня такое ощущение, что здесь есть фатальное недопонимание докладчиков. Несмотря на то, что MVP является общепринятым стандартом, большинство людей считают презентаторов контроллерами или, что еще хуже, комбинацией контроллеров, репозиториев и шлюзов.
Докладчик должен сделать одну вещь: представить. Это должно быть единственной целью. Многие люди по незнанию реализуют архитектуру MVC, называя ее MVP, с ограничением потока данных следующим образом: View <-> Controller / Presenter <-> Model. Теперь в этом шаблоне нет ничего плохого, поскольку он разделяет слои вашей системы. , если все сделано правильно. Вы должны быть в состоянии поменять свои уровни домена и данных (разработчики Android обычно называют слои уровнем Presenter и Model) в другую систему, и код все равно должен работать без каких-либо проблем с зависимостями. Чтобы достичь этого, вы должны избегать любых зависимостей, которые могли бы вызвать привязку к так называемой детализации (пользовательский интерфейс, база данных, фреймворки, оборудование, браузеры, операционная система). Теперь, говоря о слоях, у нас обычно была такая иерархия потоков данных: UI -> Domain -> Data, где в приложениях Android мы помещали весь наш код UI в компонент UI. Теперь есть 2 варианта позиционирования докладчика: Вы можете абстрагировать представление, введя интерфейс для конкретного представления докладчиков. Избегайте любых специфичных для Android / аппаратных зависимостей (например, контекстов) внутри докладчика. Если вы достигнете этого, то можете сказать, что ваш докладчик принадлежит вашему слою домена. Если ваш Presenter знает какие-либо подробности Android (или, что еще хуже, базу данных), то вы автоматически помещаете их в слой View (или даже нарушаете свою архитектуру, если пытаетесь получить доступ к базе данных из нее).
Теперь давайте предположим, что вы абстрагировали свой View и ваш Presenter является объектом Domain. Ваш Presenter больше не заботится о фактической реализации своего представления представления, у него есть своя абстракция, и он знает, куда передать значение. Будь то мобильное, веб-приложение или встроенное приложение, больше не имеет значения.
Теперь, как Presenter получает данные с уровня данных и заполняет пользовательский интерфейс данными? Мы делаем ту же технику, что и с View: абстракции.
Мы создадим интерфейсный / абстрактный класс репозитория, шлюза, службы данных или, как вы хотите, вызвать интерфейс уровня данных / модели. У вас есть POJO, ваша логика доступа к данным, кеширование и т. Д. Обратите внимание, что до сих пор мы работали с POJO! У нас нет зависимостей от какой-либо привязки к платформе (как описано выше). Но поскольку сейчас нам нужно немного кешировать, нам придется использовать SQLite Manager из Android (или Room). Как это сделать? абстракции. Абстрагируйте любую деталь, которая заставляет ваш код быть привязанным к любой платформе.
Ниже вы можете увидеть картинку, предложенную дядей Бобом для создания надежной архитектуры программного обеспечения. Внутренние слои не должны иметь никаких знаний о внешних слоях.
Эта картина отражает технику разработки, которую я только что описал здесь, которая является той же техникой, описанной в книге дяди Боба. Мы избегаем любых зависимостей от деталей, используя их абстракции. Реальные реализации (Деятельности, Фрагменты, SQLiteDatabase) «подключаются» к внутренним слоям снаружи посредством внедрения зависимостей.
Этот метод также называется инверсией зависимостей.
Я бы порекомендовал вам прочитать книгу Роберта Мартина «Чистая архитектура», чтобы глубже понять ее.