安卓中的 MVP 设计模式问题



我正在做MVP的研发,我正在考虑在我的下一个项目中使用这种设计模式。 但是我面临着这种设计模式的问题。

请看下面的java代码。

我有一个基本活动类

public class BaseActivity extends AppCompatActivity {
}

界面基本视图

public interface BaseView {
void showLoader();
void hideLoader();
}

另一个接口,用于扩展基本视图接口以维护视图之间的关系

//Game start from here
public interface TestView extends BaseView {
void showResult();
}

这是最后的活动:

public class MyTestActivity extends BaseActivity implements TestView {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_my_test);
}
@Override
public void showLoader() {
}
@Override
public void hideLoader() {
}
@Override
public void showResult() {
}
}

来自 BaseView 的2 个方法 showLoader() 和 HideLoader() 对于扩展 BaseView 的每个接口都是通用的。 这就是为什么我把它们放在BaseView中。到现在还没有问题。

问题是:我必须在实现 BaseView 或其子接口的每个类中实现和提供程序这些方法的定义。

示例:此处

TestActivity extends BaseActivity implements TestView 

因此,为了防止这个问题,我将BaseView实现到BaseActivity中,并提供这些方法定义。 但是我可以看到BaseView正在从BaseActivity进入TestActivity(如果我在BaseActivity中实现BaseView)

也来自已经实现BaseView的TestView。这是我的要求,TestView必须扩展BaseView。如果我没有在 BaseActivity 中实现 BaseView,我需要在每个 Activity 类中实现 showLoader() 和 hideLoader() 方法。 现在我在 BaseView 中有 2 种方法,它们可以更多......

请提出任何解决方案。

只需在 BaseActivity 中实现默认实现即可。因此,如果需要,您可以覆盖子项中的方法。

BaseActivity implements BaseView

我将如何实现 MVP 如下。

你会有你的BaseView和BasePresenter。然后,您的视图和演示器之间将有一个合同,该合同具有自己的接口,可以扩展您的BaseView和BasePresenter,我将向您展示如下:

示例活动

public class ExampleActivity extends BaseActivity implements ExampleContract.View {
private ExampleContract.Presenter presenter;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_example);
presenter = new ExamplePresenter(this);
presenter.start();
}
@Override
public void setPresenter(ExampleContract.Presenter presenter) {
this.presenter = presenter;
}
}

示例演示者

public class ExamplePresenter implements ExampleContact.Presenter {
private ExampleContract.View exampleView;
public ExamplePresenter(ExampleContract.View exampleView) {
this.exampleView = exampleView;
exampleView.setPresenter(this)
}
@Override
public void start() {
//do nothing for now
}
}

示例合约

public interface ExampleContract {
interface View extends BaseView<Presenter> {
}
interface Presenter extends BasePresenter {
}
}

基本视图

public interface BaseView<T> {
void setPresenter(T presenter);
}

基本演示者

public interface BasePresenter {
void start();
} 

那么我们能从中得到什么,它们是如何联系在一起的呢?

  • 因此,如果您希望共享所有合同(而不是视图)的实现,即我的每个视图和演示者都将在整个应用程序中进行setPresenter(T presenter)通话start()并将其添加到您的BaseViewBasePresenter
  • 然后在您的合约中,您的View接口和Presenter接口(各个活动将实现),然后具有与您想要实现的活动相关的自己的功能。
  • 然后,通过将自身传递到onCreate中的表示器构造函数来链接到视图,然后在表示器的构造函数中,它将通过设置表示器来回调视图。它们现在都通过具有约束力的合同相互分配。您现在要做的就是在视图界面和演示器界面中将方法添加到合约中。

最新更新