Это то же самое, что и ViewModel из шаблона проектирования Model-View-ViewModel (MVVM)
Нет.
Это было бы так :
Это имеет циклы. Дядя Боб тщательно избегал циклов .
Вместо этого у вас есть это:
Который, конечно, не имеет циклов. Но это заставляет задуматься о том, как представление узнает об обновлении. Мы вернемся к этому через минуту.
или это простой объект передачи данных (DTO)?
Процитирую Боба с предыдущей страницы:
Вы можете использовать базовые структуры или простые объекты передачи данных, если хотите. Или вы можете упаковать его в hashmap или создать в виде объекта.
Чистая архитектура p207
Так что, конечно, если хотите.
Но я сильно подозреваю, что вас действительно беспокоит это :
Это милое небольшое злоупотребление UML противопоставляет направление зависимости исходного кода с направлением потока управления. Здесь можно найти ответ на ваш вопрос.
В отношениях использования:
Поток управления идет в том же направлении, что и зависимость от исходного кода.
В отношениях реализации:
Поток управления обычно идет в направлении, противоположном зависимости исходного кода.
Что означает, что вы действительно смотрите на это:
Вы должны быть в состоянии видеть, что поток управления никогда не попадет из Presenter в View.
Как это может быть? Что это означает?
Это означает, что у представления либо есть свой собственный поток (что не так уж необычно), либо (как указывает @Euphoric) поток управления входит в представление из чего-то еще, не изображенного здесь.
Если это тот же поток, то View будет знать, когда View-Model будет готова для чтения. Но если дело обстоит именно так, и представление является графическим интерфейсом, то ему будет трудно перекрашивать экран, когда пользователь перемещает его, ожидая БД.
Если у представления есть свой собственный поток, то у него есть свой собственный поток управления. Это означает, что для реализации этого Представление должно будет опрашивать View-Model, чтобы заметить изменения.
Поскольку докладчик не знает, что представление существует, а представление не знает, что докладчик существует, они вообще не могут вызывать друг друга. Они не могут швырять события друг в друга. Все, что может произойти, это то, что докладчик запишет модель представления, а представление прочитает модель представления. Всякий раз, когда это похоже на это.
Согласно этой диаграмме единственное, что разделяют View и Presenter, это знание View-Model. И это просто структура данных. Так что не ожидайте, что это будет иметь какое-либо поведение.
Это может показаться невозможным, но его можно заставить работать, даже если View-Model сложна. Одно небольшое обновленное поле - это все, что представление должно опрашивать, чтобы обнаружить изменение.
Теперь, конечно, вы можете настаивать на использовании паттерна наблюдателя или сделать что-то простое, чтобы скрыть эту проблему от вас, но, пожалуйста, поймите, что вам это не нужно.
Вот немного забавы, иллюстрирующее поток управления:
Обратите внимание, что всякий раз, когда вы видите, что поток идет против направлений, которые я определил ранее, вы видите возвращение вызова. Этот трюк не поможет нам добраться до Вью. Ну, если мы сначала не вернемся к тому, что называется контроллером. Или вы можете просто изменить дизайн, чтобы вы могли добраться до вида. Это также исправляет то, что выглядит как начало проблемы с доступом к данным и ее интерфейсом.
Единственное, чему здесь нужно научиться, это то, что Interactor Use Case может в значительной степени вызывать вещи в любом порядке, в котором он хочет, до тех пор, пока он вызывает ведущего.