[英]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.