在 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中的视图吗?