MVP Android - 有多少主持人?

时间:2015-12-11 15:07:12

标签: android mvp

我有一个简单的问题。我正在努力(并努力)用MVP设计模式设计我的应用程序。

我可以问,对于每个视图(活动,片段),我应该有一个单独的演示者类吗?

我在网上看到的资源并不多,显然有样本说明了MVP。如果他们有一些人可以分享吗?

PS我也在这个应用程序中使用RecyclerViewAdapter所以任何关于它的指针都将受到赞赏

提前致谢

3 个答案:

答案 0 :(得分:17)

虽然陈旧,但这是一个非常有趣的问题。从现在开始,MVP / MVC / MVVM就是一种“热门词汇”。在Android社区中,这个问题值得一个更完整的答案(恕我直言)。

简答:

单个演示者可以与多个视图一起使用

答案很长:

一般来说,没有一个单一的MVP / MVC定义 - 有很多方法可以实现这些架构模式。你没有提供"你的"的定义。 MVP,因此我只能猜到你的想法。

也就是说,有一些"最佳实践"在面向对象编程中,任何架构模式的任何实现都应该(理想情况下)加以考虑。

您问的是,您是否可以重复使用具有不同视图的一个演示者实现,对吧?让我们通过SOLID原则的棱镜来看待这个问题。

" L"代表Liskov替代原则(LSP)。这是SOLID中最容易被误解的原则之一,但该原则背后的一般理念如下:

  

LSP:如果一段代码与A类对象一起工作,它也应该   与A的任何子类的对象无缝地工作(即子类必须   可以在任何地方使用而不是A

Android中的LSP违规示例为ContextContext的子类(例如ApplicationActivity)不等效。某些需要Context的代码可以与Application无缝协作,但如果您通过Activity,则会发生内存泄漏(这是Android应用程序中非常普遍的错误,主要由谷歌的开发者违反了LSP。

回到顶部你的问题。我假设您的演示者看起来像这样(请注意视图的界面):

public class SomePresenter {

    /**
     * Views bound to this presenter must implement this interface
     */
    interface SomeView {
        void doSomething1();
        void doSomething2();
    }

    public void bindView(SomeView someView) {
        // view binding logic
    }

    // more presenter's methods

}

LSP声明任何实现SomeView的类都可以与SomePresenter一起使用。演示者不应该关心传递给它的SomeView的实现是ActivityFragment,还是仅仅是单元测试的模拟。

因此,您的问题的完整答案是:只要演示者不依赖于特定的视图实现,而只能依赖于他们的超级类,一个演示者可以重复使用不同的视图。

其他信息:

我猜你问了你的问题,因为一方面,你觉得一个主持人应该能够使用不同的视图(只考虑不同UI的A / B测试),但是,另一方面事实上,观点为ActivityFragment让您对这种想法感到不安。

我个人认为,在MVC / MVP中,ActivityFragment都不应该是视图。这篇帖子背后的原因总结在这篇文章中:Why Activities in Android are not UI Elements

enter image description here

我还建议您查看一下implementation of MVP in Android的不同方法 - 如果您使用此方法,那么您可以明白主持人应该能够使用不同的视图,你不会有这样的感觉,感觉不对劲......

答案 1 :(得分:5)

模型 - 视图 - 控制器设计在软件设计中很早就出现了,最初用于按钮元素。您使用MVP(基本上与MVC相同)以实现模块化且易于维护的体系结构,将表示与逻辑分开。

鉴于你的问题,我认为你确实想要每个视图一个类。这将是最常见的方法。

http://antonioleiva.com/mvp-android/给出了MVP的理论概述。

答案 2 :(得分:1)

您的活动/片段应该有1个演示者。  我喜欢让我的所有活动都从BaseActivity扩展,然后,我让这个BaseActivity需要一个Presenter,看看这个例子:

    public abstract class BaseActivity<Presenter extends BasePresenter> extends AppCompatActivity {

    protected Presenter mPresenter;

    @NonNull
    protected abstract Presenter createPresenter(@NonNull final Context context);

    @Override
    protected void onCreate(final Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        mPresenter = createPresenter(this);
        mPresenter.onCreate(savedInstanceState);
        }
    }
    // other lifecycle methods

然后,创建一个抽象的BasePresenter

public abstract class BasePresenter {

protected BasePresenter() {
}

@NonNull
public static BasePresenter nullPresenter(@NonNull final Context context) {
    return new BasePresenter() {};
}

@CallSuper
public void onCreate(@Nullable final Bundle savedInstanceState) {
}

现在,在创建活动时,请执行以下操作:

public class MyActivity extends BaseActivity<MyActivityPresenter>{


@Override
MyActivityPresenter createPresenter(@NoNull final Context context){
     return new MyActivityPresenter(all, Your, Dependencies, Here);
    }
}

现在观看this video并了解MVP中活动/视图的责任。