MVP模型属于展示层还是领域层?

时间:2019-05-18 20:10:04

标签: android mvp android-mvp

我了解MVP。但是我不理解模型属于表示层还是领域层。据说在某些资源中,mvp仅对表示层建模,换句话说,模型在表示层中。 https://antonioleiva.com/mvp-android/

但是,在其他资源https://proandroiddev.com/clean-architecture-data-flow-dependency-rule-615ffdd79e29中,模型属于领域层。哪一个是正确的?预先感谢。

1 个答案:

答案 0 :(得分:0)

您可以具有不同类型的模型。您可以拥有DomainModelPresentationModel 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很不错。