在 MVP 模式中,适配器应该持有模型还是演示者应该持有模型并让适配器引用它?

Posted

技术标签:

【中文标题】在 MVP 模式中,适配器应该持有模型还是演示者应该持有模型并让适配器引用它?【英文标题】:In the MVP pattern, should adapters hold models or should the presenter hold models and have the adapter reference it? 【发布时间】:2016-10-26 08:54:59 【问题描述】:

目前我拥有它,以便适配器可以引用其中的所有模型。但是让演示者只拿着模型,适配器可以简单地引用它们会更好吗?

例如:

public class Adapter extends RecyclerView.Adapter<RecyclerView.ViewHolder>

private Presenter presenter;

public Adapter(Presenter presenter)
    this. presenter = presenter;


@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) 
    Model m = presenter.getModels().get(position);
    // bind model to view holder


@Override
public int getItemCount() 
    return presenter.getModels().size();




这样,当 Presenter 获取更多模型时,它只需在获取后调用 getAdapter().notfiyDataSetChanged();

【问题讨论】:

【参考方案1】:

你真的可以选择任何一种方式。有人会说将适配器视为您视图的一部分并使其尽可能愚蠢,但如果您做得对,让适配器保存数据肯定有好处。

例如,我使用一个带有泛型的抽象基础适配器,它包含一个数据对象列表来驱动recyclerview。它为列表提供了所有标准的 CRUD 操作(添加、更新、删除、移动等)。这些方法还处理通知适配器更改,因此我的客户端代码不必担心它。它只是将一个对象交给适配器或告诉它删除/更改一个对象,然后适配器处理其余的。

这里最大的好处是大大减少了用于 CRUD 操作的重复样板代码的数量,以及与回收视图交互的各个参与者之间的数据集更改通知。如果您有不止一两个屏幕显示回收站视图,那么节省的费用会迅速累积起来,这比盲目地遵循口头禅更有益。

【讨论】:

啊,我明白了。您是否有任何抽象适配器的示例。如果我不走抽象适配器的方式,你会说我应该让演示者拿着模型吗?【参考方案2】:

通常适配器被认为是 View 的一个实现细节。

演示者不应该知道查看实现细节。

适配器的工作是保存一组项目并将其发布到视图。 Adapter 不应该知道 Presenter、模型、其他视图等。

据我了解,适配器的数据流:

Model -> Presenter -> View -> Adapter-> ItemView

控制流相反,最好跳过适配器。

随时在项目问题中提出问题。

【讨论】:

如果 Adapter 和 Presenter 必须进行通信,我该怎么办?例如,如果它是一个照片列表,并且用户喜欢一张照片。我是否必须在 View 中实现一个方法才能充当中间人? View 要做的就是调用getPresenter().likePhoto(); 在这种情况下,我将在 View 中使用 lambda 将 onClick 事件从 ItemView 传输到 Presenter。 hmm.. 你有一个例子说明它的外观吗?我对 lamdas 不是很熟悉……但即使使用 lamda,如果类似失败(设备脱机或服务器错误)会发生什么?我们需要不喜欢这张照片。 github.com/konmik/nucleus/blob/master/nucleus-example-real-life/…

以上是关于在 MVP 模式中,适配器应该持有模型还是演示者应该持有模型并让适配器引用它?的主要内容,如果未能解决你的问题,请参考以下文章

从单元测试的角度来看:视图应该指定演示者还是 GWT MVP 中的其他方式?

我应该以MVP模式将我的视图投射到iOS上的演示者中的UIViewController吗?

应该将演示者(mvP)注入(dagger2)到android中的视图吗?

WinForms 中的模型视图演示者

在 MVP 模式中,了解活动/上下文的演示者是不是是个坏主意?

使用 MVP 模式和 OO 原则