我应该在Mosby MvP概念中创建BaseActivity / Presenter和View吗?

时间:2016-01-23 18:30:11

标签: android mosby

我试图理解MvP设计模式的概念。我的意思是,我明白了,很容易。主要问题是最佳实施。我试图创建自己的BaseActivity,BasePresenter和BaseView只是为了从我的所有活动中提取一部分关节,我已经这样做了:

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,或者给我一些提示我应该如何划分我的项目?谢谢!

2 个答案:

答案 0 :(得分:2)

所以我看到两种可能性:

  1. 您可以从Mosby的MvpActivity扩展为您的基类,并添加您的员工,如initView()initLibraries()等。BaseActivity<P extends BasePresenter<? extends BaseView>> extends MvpActivity<P> implements BaseView。然后是MyFooActivity extends BaseActivity<FooPresenter>。所以你在BaseActivity中包括一次Butterknife它应该有用。但是,你可能不得不像Fragter的Butterknife.bind()那样复制那些代码,因为Activity和Fragments显然没有相同的超类。我将告诉你如何解决上述问题。

  2. 反过来说:将Mosby的功能集成到BaseActivity中。 Mosby的构建原则是“赞成合成而非继承”。那究竟是什么意思呢? Mosby提供ActivityMvpDelegate。正如名称已经暗示这个委托完成了实例化Presenter等的所有工作。但是,不是继承自MvpActivity,而是使用此委托并调用相应的委托方法。实际上,如果你看一下source code,Mosby的MvpActivity就是这么做的。因此,您只需在MvpActivity中使用MvpActivityDelegate,而不是从Mosby BaseActivity延伸。

  3. 那么重复代码如Butterknife.bind(),即在Activity和Fragment中呢。好吧,Mosby可以分享他的代码,例如在Activity和Fragment之间实例化Presenter等,因为它们都使用了mosby委托。

    因此,您可以应用相同的原则:您可以将共享代码放入委托,并从活动和片段中调用委托。 问题是:是否值得,Butterknife.bind()只是一个电话。您还必须拨打一个电话yourDelegate.doSomething() ... 但是如果你必须在活动和片段之间重用“关键代码”,那么就像Mosby那样有利于组合。

    如果您知道自己只使用Activites,那么从Mosby的MvpActivity扩展也将是一个很好的选择,如1.解决方案中所述。

答案 1 :(得分:0)

我只是想加入sockeqwe的第一个答案。

在有意义的地方创建自己的基类是完全没问题的。它也很简单。

例如,我需要创建一个具有默认行为的基础Fragment。您需要做的就是复制基本泛型类型签名并将其传递给基类。

例如:

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