Вы можете иметь разные типы моделей. Вы можете иметь DomainModel , PresentationModel ApplicationModel и т. Д.
Вы можете использовать каждый тип модели в приложении MVP, если вам нужно. например, если у вас есть сложное приложение с несколькими докладчиками , которым необходимо взаимодействовать друг с другом, может быть полезно добавить дополнительные ApplicationModel чтобы упростить эту связь, добавив Модель , которая имеет Данные и поведение, специфичные для приложения . Если у вас его нет, вы можете просто использовать DomainModel .
В этой статье Мартин Фаулер говорит:
Контролирующий контроллер разделяет функциональность представления на две части.
части: контроллер (часто называемый ведущим) и вид. Данные домена
что нужно отображать отдельно, а следуя грубому MVC
Терминология я буду ссылаться на него как на модель, хотя это не должно быть
Модель предметной области.
Это сложный вопрос, но основное отличие состоит в том, что чистый DomainModel обычно моделирует некоторый домен (математика, банковское дело и т. Д.) И не имеет данных представления или приложения и / или поведение. Вы можете смешивать различные типы моделей в вашем приложении.
Если ваше приложение имеет некоторую сложную логику, скажите, что, когда одна вещь выбрана, другую вещь нужно отменить. Вы можете захватить это в конкретной модели, скажем, ApplicationState
, которая не является DomainModel .
Вот пример. Допустим, у нас есть приложение, которое имеет Ключевые слова и Теги и отображает их для пользователя. Пользователь может выбрать только ключевое слово или тег . Он не может выбрать оба одновременно. Вот способ сделать это с помощью модели, которая фиксирует специфическую логику этого приложения, которая не является частью нашего домена . Мы используем паттерн наблюдателя здесь. Когда это Модель изменяется, мы инициируем события.
class ApplicationSate : Subject {
private Tag mSelectedTag;
private Keyword mSelectedKeyword;
public Tag getSelectedTag() { return mSelectedTag; }
public Keyword getSelectedKeyword() { return mSelectedKeyword; }
public Tag HasSelectedTag() { return mSelectedTag != null; }
public Tag HasSelectedKeyword() { return mSelectedKeyword != null; }
public void selectKeyword(Keyword keyword) {
if(hasSelectedTag()) {
mSelectedTag = null;
}
mSelectedKeyword = keyword;
raiseChangedEvent();
}
public void selectTag(Tag tag) {
if(hasSelectedKeyword()){
mSelectedKeyword = null;
}
mSelectedTag = tag;
raiseChangedEvent();
}
}
Вот хорошая статья об архитектурах GUI.