2016-01-23 262 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>