2016-01-23 82 views
2

我想了解MvP設計模式的概念。我的意思是,我明白了,這很容易。主要問題是最佳實施。我試圖讓我自己BaseActivity,BasePresenter和基本視點只是爲了提取我的所有活動的聯合的一部分,我已經完成這件事是這樣的:我應該在Mosby MvP概念中創建BaseActivity/Presenter和View嗎?

BaseActivity

public abstract class BaseActivity<T extends BasePresenter<? extends IBaseView>> extends FragmentActivity implements IBaseView { 

    protected T presenter; 
    private ActivityConfig activityConfig; 

    @Override 
    final protected void onCreate(Bundle savedInstanceState) { 
     activityConfig = getConfig(); 

     super.onCreate(savedInstanceState); 

     presenter = createPresenter(); 

     setContentView(); 
     initLibraries(); 

     prepareView(savedInstanceState); 
     addFragments(); 
    } 

    protected abstract ActivityConfig getConfig(); 

    protected abstract T createPresenter(); 

    protected abstract void prepareView(Bundle savedInstanceState); 

    protected abstract void addFragments(); 

    private void setContentView(){ 
     View root = View.inflate(this, activityConfig.layoutId, null); 
     setContentView(root); 
    } 

    private void initLibraries() { 
     ButterKnife.bind(this); 
     Timber.plant(new Timber.DebugTree()); 

    } 

    @Override 
    public BaseActivity getCurrentContext() { 
     return this; 
    } 

    @Override 
    public T getPresenter() { 
     return presenter; 
    } 
} 

BasePresenter

public abstract class BasePresenter<T extends IBaseView> { 

    public abstract void loadData(boolean refresh); 

} 

基本視點

public interface IBaseView { 

    BaseActivity getCurrentContext(); 

    BasePresenter getPresenter(); 
} 

它工作正常,但我覺得這是不好的設計,使我想用Mosby代替。問題是,所有的教程都不涉及基類的方面,他們只是使用Mosby的基礎(我認爲這很糟糕,因此我必須複製我的代碼(例如Butterknife.bind())。你們給我一些很好的設計,快速啓動類莫斯MVP或者給我一些建議,我應該如何分配我的項目由於

+0

有到MVP Android上許多不同的方法,他們中的每一個與*優點*和*缺點*,很難說哪一個是正確的或更好你將不得不爲自己找到一個最適合你的人。 –

回答

2

所以我看到兩種可能性:?!

  1. 你可以從莫斯的MvpActivity爲延長你的基類,並添加你的工作人員,如initView(),initLibraries()等,以便BaseActivity<P extends BasePresenter<? extends BaseView>> extends MvpActivity<P> implements BaseView。然後MyFooActivity extends BaseActivity<FooPresenter>。所以你包括Butterknife一次在BaseActivity,它應該工作。但是,您可能必須複製類似Butterknife.bind()for Fragments的代碼,因爲Activity和Fragments顯然沒有相同的超類。我會告訴你如何解決上述問題。

  2. 相反:將Mosby的功能集成到您的BaseActivity中。莫斯比是建立在原則「贊成組合遺傳」。那麼這實際上意味着什麼? Mosby提供ActivityMvpDelegate。正如名稱已經表明,這個委託可以完成實例化Presenter等的所有工作。但是,您可以使用此委託並調用相應的委託方法,而不是繼承MvpActivity。其實Mosby的MvpActivity正是這樣做,如果你看看source code。因此,您只需在您的BaseActivity中使用MvpActivityDelegate,而不是從Mosby的MvpActivity延伸。

那麼,關於複製像Butterknife.bind()即在活動和片段代碼。那麼,Mosby可以分享他的代碼,比如在Activity和Fragment之間實例化Presenter等,因爲兩者都使用mosby委託。

因此,您可以應用相同的原則:您可以將共享代碼放入委託並從兩者中調用委託,活動和片段。 問題是:是否值得,即Butterknife.bind()只是一個單一的電話。您還需要撥打一個電話yourDelegate.doSomething() ... 但是,如果您不得不重複使用活動和片段之間的「關鍵代碼」,那麼贊成像Mosby這樣的組合。

如果您知道您只使用Activites,那麼從Mosby的MvpActivity擴展也是一個很好的選擇,如第1節所述。

0

我只是想添加到sockeqwe的第一個答案。

創建自己的基類是非常合適的,因爲它是有意義的。這也很簡單。

例如,我需要創建一個基地Fragment與一些默認行爲。您只需複製基本泛型類型簽名並將其傳遞給基類即可。

例如:

public abstract class MyBaseFragment<V extends MvpView, P extends MvpPresenter<V>> extends MvpFragment<V, P>