我试图理解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,或者给我一些提示我应该如何划分我的项目?谢谢!
答案 0 :(得分:2)
所以我看到两种可能性:
您可以从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显然没有相同的超类。我将告诉你如何解决上述问题。
反过来说:将Mosby的功能集成到BaseActivity
中。 Mosby的构建原则是“赞成合成而非继承”。那究竟是什么意思呢? Mosby提供ActivityMvpDelegate
。正如名称已经暗示这个委托完成了实例化Presenter等的所有工作。但是,不是继承自MvpActivity
,而是使用此委托并调用相应的委托方法。实际上,如果你看一下source code,Mosby的MvpActivity
就是这么做的。因此,您只需在MvpActivity
中使用MvpActivityDelegate
,而不是从Mosby BaseActivity
延伸。
那么重复代码如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>