我了解MVP。但是我不理解模型属于表示层还是领域层。据说在某些资源中,mvp仅对表示层建模,换句话说,模型在表示层中。 https://antonioleiva.com/mvp-android/
但是,在其他资源https://proandroiddev.com/clean-architecture-data-flow-dependency-rule-615ffdd79e29中,模型属于领域层。哪一个是正确的?预先感谢。
答案 0 :(得分:0)
您可以具有不同类型的模型。您可以拥有DomainModel,PresentationModel ApplicationModel等。
如果需要,可以在MVP应用程序中使用各种模型。例如,如果您的复杂应用程序具有多个需要相互通信的 Presenters ,则添加一个附加的 ApplicationModel 可能会很有用> 通过添加具有 特定于应用程序的数据和行为 的 模型 来简化这些通信。如果没有,则可以使用纯 DomainModel 。
在this article中,马丁·福勒说:
监督控制器将演示功能分解为两个 部件:控制器(通常称为演示者)和视图。域数据 需要显示的内容是单独的,并遵循大致的MVC 术语我将其称为模型,尽管它不一定是 域模型。
这是一个棘手的问题,但是基本的区别是,纯 DomainModel 通常会建模某些域(数学,银行等),并且没有表示或应用程序特定的数据和/或行为。您可以在应用程序中混合使用不同类型的模型。
如果您的应用程序具有某些复杂的逻辑,请说当选择了一个事物时,则需要取消选择另一个事物。您可以在特定模型中捕获它,例如ApplicationState
,它不是 DomainModel 。
这是一个例子。假设我们有一个具有 关键字 和 标签 的应用程序,并将它们显示给用户。用户只能选择 关键字 或 标签 。他不能同时选择两个。通过唱一个捕获该应用程序特定逻辑的模型来做到这一点,该模型不属于我们的 Domain 。我们在这里使用观察者模式。当此 模型 更改时,我们引发事件。
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架构上article很不错。