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



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

这样做了:

基本活动

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;
    }
}

基本演示者

public abstract class BasePresenter<T extends IBaseView> {
    public abstract void loadData(boolean refresh);
}

基本视图

public interface IBaseView {
    BaseActivity getCurrentContext();
    BasePresenter getPresenter();
}

它工作正常,但我觉得这设计不好,所以我想改用 Mosby。问题是所有的教程都没有涉及基类的各个方面,它们只是使用 Mosby 的教程作为基类(我想很糟糕?我必须复制我的代码(例如 Butterknife.bind())。那么你们能给我一些为 Mosby MVP 设计的快速入门课程,或者给我一些提示,我应该如何划分我的项目吗?谢谢!

所以我看到了两种可能性:

  1. 您可以从 Mosby 的MvpActivity扩展为基类,并添加您的员工,如 initView()initLibraries() 等。这样BaseActivity<P extends BasePresenter<? extends BaseView>> extends MvpActivity<P> implements BaseView.然后MyFooActivity extends BaseActivity<FooPresenter>.所以你BaseActivity一次包括黄油刀,它应该可以工作。但是,您可能必须复制该代码,例如 Butterknife.bind()' 用于片段,因为活动和片段显然没有相同的超类。我将在上面向您展示如何解决这个问题。

  2. 反其道而行之:将 Mosby 的功能集成到您的BaseActivity中。莫斯比是按照"偏爱组合而不是继承"的原则建造的。那么这实际上意味着什么呢?莫斯比提供ActivityMvpDelegate .顾名思义,这个委托会完成实例化演示器等的所有工作。但是,您不是从MvpActivity继承,而是使用此委托并调用相应的委托方法。实际上,如果你看一下源代码,Mosby的MvpActivity就是这样做的。因此,与其从莫斯比的MvpActivity扩展,不如简单地在BaseActivity中使用MvpActivityDelegate

那么像Butterknife.bind()一样复制代码,即在活动和片段中呢?好吧,Mosby可以在Activity和Fragment之间共享他的代码,例如实例化演示器等,因为两者都使用mosby委托。

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

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

我只是想补充一下sockeqwe的第一个答案。

有意义的地方创建自己的基类是完全可以的。这也非常简单。

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

例如:

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

最新更新