我应该在 Mosby MvP 概念中创建 BaseActivity/Presenter 和 View 吗?
Should I create BaseActivity/Presenter and View in Mosby MvP concept?
我正在尝试理解 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;
}
}
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()例如)。那么你们能给我一些设计良好的 Mosby MVP 快速入门 类 或者给我一些我应该如何划分我的项目的提示吗?谢谢!
所以我看到了两种可能性:
你可以从 Mosby 的 MvpActivity
扩展为你的基地 class 并添加你的员工,如 initView()
、initLibraries()
等。这样 BaseActivity<P extends BasePresenter<? extends BaseView>> extends MvpActivity<P> implements BaseView
。然后MyFooActivity extends BaseActivity<FooPresenter>
。所以你在 BaseActivity
中包含 Butterknife 一次,它应该可以工作。但是,您可能必须为 Fragments 复制类似 Butterknife.bind()` 的代码,因为 Activity 和 Fragments 显然没有相同的超级 class。我会告诉你如何解决上面的问题。
反其道而行之:将 Mosby 的功能集成到您的 BaseActivity
中。 Mosby是按照"favor composition over inheritance"的原则构建的。那么这到底是什么意思呢? Mosby 提供了 ActivityMvpDelegate
。顾名思义,这个委托完成了实例化 Presenter 等的所有工作。但不是从 MvpActivity
继承,而是使用这个委托并调用相应的委托方法。实际上,如果您看一下 source code,Mosby 的 MvpActivity
就是这样做的。因此,与其从 Mosby 的 MvpActivity
扩展,不如在 BaseActivity
中使用 MvpActivityDelegate
。
那么复制像 Butterknife.bind()
这样的代码呢,即在 Activity 和 Fragment 中。好吧,Mosby 可以在 Activity 和 Fragment 之间共享他的代码,例如实例化 Presenter 等,因为两者都使用 mosby 委托。
因此您可以应用相同的原则:您可以将共享代码放入委托中并从 activity 和片段中调用委托。
问题是:是否值得,即 Butterknife.bind()
只是一个电话。您还必须拨打一个电话 yourDelegate.doSomething()
...
但是,如果你必须在 activity 和片段之间重用 "critical code",那么像 Mosby 那样支持组合。
如果您知道您只使用 Activites
,那么从 Mosby 的 MvpActivity 扩展也是一个不错的选择,如 1. 解决方案中所述。
我只是想补充一下 sockeqwe 的第一个答案。
在有意义的地方创建自己的基础 class 完全没问题。这也很简单。
例如,我需要创建一个具有某些默认行为的基础 Fragment
。您需要做的就是复制基本泛型类型签名并将其传递给基本 class.
例如:
public abstract class MyBaseFragment<V extends MvpView, P extends MvpPresenter<V>> extends MvpFragment<V, P>
我正在尝试理解 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;
}
}
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()例如)。那么你们能给我一些设计良好的 Mosby MVP 快速入门 类 或者给我一些我应该如何划分我的项目的提示吗?谢谢!
所以我看到了两种可能性:
你可以从 Mosby 的
MvpActivity
扩展为你的基地 class 并添加你的员工,如initView()
、initLibraries()
等。这样BaseActivity<P extends BasePresenter<? extends BaseView>> extends MvpActivity<P> implements BaseView
。然后MyFooActivity extends BaseActivity<FooPresenter>
。所以你在BaseActivity
中包含 Butterknife 一次,它应该可以工作。但是,您可能必须为 Fragments 复制类似 Butterknife.bind()` 的代码,因为 Activity 和 Fragments 显然没有相同的超级 class。我会告诉你如何解决上面的问题。反其道而行之:将 Mosby 的功能集成到您的
BaseActivity
中。 Mosby是按照"favor composition over inheritance"的原则构建的。那么这到底是什么意思呢? Mosby 提供了ActivityMvpDelegate
。顾名思义,这个委托完成了实例化 Presenter 等的所有工作。但不是从MvpActivity
继承,而是使用这个委托并调用相应的委托方法。实际上,如果您看一下 source code,Mosby 的MvpActivity
就是这样做的。因此,与其从 Mosby 的MvpActivity
扩展,不如在BaseActivity
中使用MvpActivityDelegate
。
那么复制像 Butterknife.bind()
这样的代码呢,即在 Activity 和 Fragment 中。好吧,Mosby 可以在 Activity 和 Fragment 之间共享他的代码,例如实例化 Presenter 等,因为两者都使用 mosby 委托。
因此您可以应用相同的原则:您可以将共享代码放入委托中并从 activity 和片段中调用委托。
问题是:是否值得,即 Butterknife.bind()
只是一个电话。您还必须拨打一个电话 yourDelegate.doSomething()
...
但是,如果你必须在 activity 和片段之间重用 "critical code",那么像 Mosby 那样支持组合。
如果您知道您只使用 Activites
,那么从 Mosby 的 MvpActivity 扩展也是一个不错的选择,如 1. 解决方案中所述。
我只是想补充一下 sockeqwe 的第一个答案。
在有意义的地方创建自己的基础 class 完全没问题。这也很简单。
例如,我需要创建一个具有某些默认行为的基础 Fragment
。您需要做的就是复制基本泛型类型签名并将其传递给基本 class.
例如:
public abstract class MyBaseFragment<V extends MvpView, P extends MvpPresenter<V>> extends MvpFragment<V, P>