我在MVP上做R& D,我正在考虑将这个设计模式用于我的下一个项目。 但是我遇到了这种设计模式的问题。
请看下面的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个方法,它们可以更多......
请建议任何解决方案。
答案 0 :(得分:2)
只需在BaseActivity中实现默认实现。因此,如果需要,您可以覆盖子项中的方法。
BaseActivity implements BaseView
答案 1 :(得分:1)
我将如何实施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
界面(各个活动将实施的界面)将为您要实施的活动提供个人自己的功能。< / LI>
onCreate
中的演示者构造函数链接到视图,然后在Presenter的构造函数内部通过设置演示者来回调视图。他们现在都通过有约束力的合同分配给对方。您现在要做的就是在View界面和Presenter界面中将方法添加到合同中。