MVP模式探讨
来源:互联网 发布:淘宝号贷款怎么贷款 编辑:程序博客网 时间:2024/06/04 17:59
先从字面意义上来了解MVP
M——Model 模型
V——View 视图
P——Presenter 呈献者
*这里的View不是Android 组件,而是MVP模式的一部分
从Android控件方面来说,View部分都是一些Fragment以及View,其中不包括数据、逻辑,只做单纯的显示,这样大大地简化了View的代码量,而且与Model完全解耦。**The view contains almost no logic: it converts the presenter’s commands to UI actions and listens to user actions, which are passed to the presenter。**View部分不含逻辑,主要作用是将Presenter中的代码命令转化成界面行为,并且监听用户操作并将此操作传递到Presenter层进行逻辑处理。View和Presenter之间用接口来联系。
这里的P主要将V呈现在大家面前。为了把View和Model测底隔开,以往View中的数据变更等代码都放到了Presenter中,因此该模块中的代码就显得比较拥挤。基本业务逻辑也是存放在Presenter中。
接下来分析google提供的TODOAPP代码
先定义View和Presenter的基类
public interface BaseView<T> { void setPresenter(T presenter);}
public interface BasePresenter { void start();}
TasksContract类用来联系二者。
public interface TasksContract { interface View extends BaseView<Presenter> { ... } interface Presenter extends BasePresenter{ ... }}
具体的View继承自Fragment并且实现了TaskContract.View接口
public class TasksFragment extends Fragment implements TasksContract.View { private TasksContract.Presenter mPresenter; private TasksAdapter mListAdapter; private View mNoTasksView; private ImageView mNoTaskIcon; private TextView mNoTaskMainView; private TextView mNoTaskAddView; private LinearLayout mTasksView; private TextView mFilteringLabelView; ... public TasksFragment() { // Requires empty public constructor } public static TasksFragment newInstance() { return new TasksFragment(); } ... @Override public void setPresenter(@NonNull TasksContract.Presenter presenter) { mPresenter = checkNotNull(presenter); } ...}
具体的Presenter实现了TaskContract.Presenter接口
public class TasksPresenter implements TasksContract.Presenter { private final TasksRepository mTasksRepository; private final TasksContract.View mTasksView; private TasksFilterType mCurrentFiltering = TasksFilterType.ALL_TASKS; private boolean mFirstLoad = true; public TasksPresenter(@NonNull TasksRepository tasksRepository, @NonNull TasksContract.View tasksView) { mTasksRepository = checkNotNull(tasksRepository, "tasksRepository cannot be null"); mTasksView = checkNotNull(tasksView, "tasksView cannot be null!"); mTasksView.setPresenter(this); } ... @Override public void start() { loadTasks(false); } ... //实例化之后,一旦显示,立即执行start()方法 @Override public void onResume() { super.onResume(); mPresenter.start(); }}
Activity中的相关代码
public class TasksActivity extends AppCompatActivity { private static final String CURRENT_FILTERING_KEY = "CURRENT_FILTERING_KEY"; private DrawerLayout mDrawerLayout; private TasksPresenter mTasksPresenter; ... @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.tasks_act); ... //实例化TasksFragment ... //实例化TasksPresenter,内部开始运行start()方法 } }
- MVP模式探讨
- MVC模式和MVP模式的非深入探讨
- MVP模式
- MVP模式
- MVP模式
- MVP模式
- MVP模式
- MVP模式
- MVP模式
- mvp模式
- MVP模式
- mvp模式
- MVP模式
- MVP模式
- mvp模式
- MVP模式
- mvp模式
- MVP模式
- 深入JVM虚拟机(一) 初识JVM
- android获取短信验证码并自动填写的实现一
- JAVA源码---String
- 更高效的Fibonacci求解
- css3 圆角框
- MVP模式探讨
- ACM 数论 A problem is easy
- Selenium - Working with SELECT elements
- 由《炮灰模型——女生选择追求者模型》到“微软钻石题”
- 一个奇怪的串口问题
- Opencv中如何保存Mat矩阵
- 在Centos7上搭建SVN服务器并实现自动同步至web目录
- webview页面的返回和前进
- 年纪大了的过