Android

时间:2018-02-08 10:17:49

标签: java android oop mvp android-mvp

我在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个方法,它们可以更多......

请建议任何解决方案。

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()来电在整个应用中,将其添加到BaseViewBasePresenter
  • 然后在您的合同中,您的View界面和Presenter界面(各个活动将实施的界面)将为您要实施的活动提供个人自己的功能。< / LI>
  • 然后,Presenter通过将自身传递到onCreate中的演示者构造函数链接到视图,然后在Presenter的构造函数内部通过设置演示者来回调视图。他们现在都通过有约束力的合同分配给对方。您现在要做的就是在View界面和Presenter界面中将方法添加到合同中。