簡體   English   中英

Android中的MVP設計模式問題

[英]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()調用,請將其添加到BaseViewBasePresenter
  • 然后在您的合同中,您的View界面和Presenter界面(各個活動將實現的界面)將使您自己的功能與您要實現的活動相對應。
  • 然后,Presenter通過將自身傳遞到onCreate的presenters構造函數鏈接到視圖,然后在Presenter的構造函數內部,它將通過設置演示者回調到視圖。 他們現在都通過有約束力的合同分配給對方。 您現在要做的就是在View界面和Presenter界面中將方法添加到您的合同中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM