[英]MVP design pattern issue in Android
我在MVP上做研发,我正在考虑将这个设计模式用于我的下一个项目。 但我面临着这种设计模式的问题。
请看下面的java代码。
我有一个BaseActivity类
public class BaseActivity extends AppCompatActivity {
}
接口BaseView
public interface BaseView {
void showLoader();
void hideLoader();
}
另外一个接口扩展了BaseView接口以维护视图之间的关系
//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或其Child接口的每个类中实现和提供这些方法的定义。
示例:此处
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。 那么你的View和Presenter之间有一个合约,它有自己的扩展你的BaseView和BasePresenter的接口,我将告诉你如下:
为ExampleActivity
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;
}
}
ExamplePresenter
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
}
}
ExampleContract
public interface ExampleContract {
interface View extends BaseView<Presenter> {
}
interface Presenter extends BasePresenter {
}
}
基本视点
public interface BaseView<T> {
void setPresenter(T presenter);
}
BasePresenter
public interface BasePresenter {
void start();
}
那么我们可以从中获取什么呢?它们如何联系起来呢?
setPresenter(T presenter)
和start()
调用,请将其添加到BaseView
或BasePresenter
。 View
界面和Presenter
界面(各个活动将实现的界面)将使您自己的功能与您要实现的活动相对应。 onCreate
的presenters构造函数链接到视图,然后在Presenter的构造函数内部,它将通过设置演示者回调到视图。 他们现在都通过有约束力的合同分配给对方。 您现在要做的就是在View界面和Presenter界面中将方法添加到您的合同中。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.