2

我试图理解 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 快速入门课程,或者给我一些提示,我应该如何划分我的项目?谢谢!

4

2 回答 2

2

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

  1. 您可以从 Mosby's 扩展MvpActivity为您的基类,并添加您的员工等initView()initLibraries()这样BaseActivity<P extends BasePresenter<? extends BaseView>> extends MvpActivity<P> implements BaseView。然后MyFooActivity extends BaseActivity<FooPresenter>。因此,您将 Butterknife 包含在BaseActivity其中,它应该可以工作。但是,您可能必须为 Fragments 复制 Butterknife.bind() 之类的代码,因为 Activity 和 Fragments 显然没有相同的超类。我将向您展示如何解决上述问题。

  2. 反过来做:将 Mosby 的功能集成到您的BaseActivity. Mosby 是按照“优先组合优于继承”的原则构建的。那么这实际上意味着什么?莫斯比提供了一个ActivityMvpDelegate. 顾名思义,这个委托完成了所有实例化 Presenter 等工作。但不是从MvpActivity你那里继承,而是使用这个委托并调用相应的委托方法。实际上,如果您查看源代码, Mosby'sMvpActivity正是这样做的。因此,无需从 Mosby 扩展,您只需在.MvpActivityMvpActivityDelegateBaseActivity

那么Butterknife.bind()在 Activity 和 Fragment 中复制代码呢?好吧,Mosby 可以在 Activity 和 Fragment 之间共享他的代码,例如实例化 Presenter 等,因为两者都使用 mosby 委托。

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

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

于 2016-01-25T20:09:24.417 回答
0

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

在有意义的地方创建自己的基类是非常好的。这也很简单。

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

例如:

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

于 2018-01-02T19:32:45.153 回答