【架构】MVP模型
MVP模型一般要创建三个文件夹:View、Interactor(Model)、Presenter
每个部分都有其接口和实现类,就是为了方便回调

这里做一个登陆界面为例子:
接口:
InteractorInterface:
public interface LoginInteractor {
void login(String userName,String password,OnLoginFinishedListener listener);
}
PresenterInterface
public interface LoginPresenter {
void validateCredentials(String userName,String password);
void onDestroy();
}
public interface OnLoginFinishedListener {
void onUserNameError();
void onPasswordError();
void onSuccess();
}
ViewInterface
public interface LoginView {
void setUserNameError();
void setPasswordError();
void navigateToHome();
}
实现类:
InteractorImpl
public class LoginInteractorImpl implements LoginInteractor {
@Override
public void login(final String userName, final String password, final OnLoginFinishedListener listener) {
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
Log.i("ZhiXueHui", "LoginInteractorImpl-login");
boolean error = false;
if(TextUtils.isEmpty(userName)){
listener.onUserNameError();
error = true;
}
if(TextUtils.isEmpty(password)){
listener.onPasswordError();
error = true;
}
if(!error){
listener.onSuccess();
}
}
},2000);
}
}
PresenterImpl
public class LoginPresenterImpl implements LoginPresenter,OnLoginFinishedListener {
private LoginView loginView;
private LoginInteractor loginInteractor;
public LoginPresenterImpl(LoginView loginView){
this.loginView = loginView;
this.loginInteractor = new LoginInteractorImpl();
}
@Override
public void validateCredentials(String userName, String password) {
Log.i("ZhiXueHui", "LoginPresenterImpl-validateCredentials");
loginInteractor.login(userName,password,this);
}
@Override
public void onDestroy() {
Log.i("ZhiXueHui", "LoginPresenterImpl-onDestroy");
loginView = null;
}
@Override
public void onUserNameError() {
Log.i("ZhiXueHui", "LoginPresenterImpl-onUserNameError");
if(loginView!=null){
loginView.setUserNameError();
}
}
@Override
public void onPasswordError() {
Log.i("ZhiXueHui", "LoginPresenterImpl-onPasswordError");
if(loginView!=null){
loginView.setPasswordError();
}
}
@Override
public void onSuccess() {
Log.i("ZhiXueHui", "LoginPresenterImpl-onSuccess");
if(loginView!=null){
loginView.navigateToHome();
}
}
}
ViewActivity
public class LoginActivity extends Activity implements LoginView, View.OnClickListener {
private EditText userName;
private EditText password;
private Button button;
private LoginPresenter presenter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login);
Log.i("ZhiXueHui", "LoginActivity-onCreate");
userName = (EditText) findViewById(R.id.userName);
password = (EditText) findViewById(R.id.password);
button = (Button) findViewById(R.id.button);
button.setOnClickListener(this);
presenter = new LoginPresenterImpl(this);
}
@Override
public void setUserNameError() {
Log.i("ZhiXueHui", "LoginActivity-setUserNameError");
userName.setError(getString(R.string.username_error));
}
@Override
public void setPasswordError() {
Log.i("ZhiXueHui", "LoginActivity-setPasswordError");
password.setError(getString(R.string.password_error));
}
@Override
public void navigateToHome() {
Log.i("ZhiXueHui", "LoginActivity-navigateToHome");
startActivity(new Intent(this, MainActivity.class));
finish();
}
@Override
public void onClick(View v) {
Log.i("ZhiXueHui", "LoginActivity-onClick");
presenter.validateCredentials(userName.getText().toString(),password.getText().toString());
}
}
流程图:

流程解释:
第一步:View的实现类调用Presenter的接口
第二步:Presenter的实现类调用Model的接口
第三步:Model的实现类回调Presenter的接口
第四步:Presenter的实现类回调View的接口
一个循环下来,正好是View->Presenter->Model->Presenter->View。
其中要注意的是,Presenter作为中转,分别对接View的实现类和Model的实现类,所以必须要建立两个接口
【架构】MVP模型的更多相关文章
- MVP模型
MVP模型一般要创建三个文件夹:View.Interactor(Model).Presenter 每个部分都有其接口和实现类,就是为了方便回调 这里做一个登陆界面为例子: 接口: Interactor ...
- 【云安全与同态加密_调研分析(6)】云计算及云安全主流体系架构与模型——By Me
云计算及云安全的主流体系架构与模型 1. 云计算主流安全参考模型 1.1 云计算安全参考 ...
- Caffe学习笔记(一):Caffe架构及其模型解析
Caffe学习笔记(一):Caffe架构及其模型解析 写在前面:关于caffe平台如何快速搭建以及如何在caffe上进行训练与预测,请参见前面的文章<caffe平台快速搭建:caffe+wind ...
- 【UE4】GAMES101 图形学作业1:mvp 模型、视图、投影变换
总览 到目前为止,我们已经学习了如何使用矩阵变换来排列二维或三维空间中的对象.所以现在是时候通过实现一些简单的变换矩阵来获得一些实际经验了.在接下来的三次作业中,我们将要求你去模拟一个基于CPU 的光 ...
- EF架构~充血模型设置不被持久化的属性
回到目录 在Poco实体中,一般只有属性没有方法,这在软件设计中称为贫血模型,而在DDD领域驱动设计中,比较提倡充血模型,即你的Poco实体中,即有属性,也有操作属性的方法,注意这里说的是操作属性的方 ...
- EF架构~CodeFirst模型下的数据初始化
回到目录 我为什么会来 在传统的大型系统设计中,数据库建模是个比开发更早的环节,先有数据库,然后是ORM模型,最后才是开发程序,而这种模型在EF出现后发生了转变,而且有可能将来会被code first ...
- qt model/view 架构自定义模型之QFileSystemModel
# -*- coding: utf-8 -*- # python:2.x #QFileSystemModel """ Qt 内置了两种模型:QStandardItemM ...
- qt model/view 架构自定义模型之QStringListModel
# -*- coding: utf-8 -*- # python:2.x #QStringListModel #QStringListModel 是最简单的模型类,具备向视图提供字符串数据的能力. # ...
- 28. ClustrixDB 分布式架构/评估模型
本节描述如何在数据库中计算查询.在ClustrixDB中,我们跨节点切片数据,然后将查询发送到数据.这是数据库的基本原则之一,它允许随着添加更多节点而几乎线性地扩展. 有关如何分布数据的概念,请参阅数 ...
随机推荐
- 64位win系统上面tomcat6启动不了 window不能再本地计算机启动
64位的jdk装完之后,jre的bin目录下面没有client文件夹, 而tomcat6.0.20的默认配置启动在client文件夹下面. 所以打开tomcat6w,在java选项界面,取消Use d ...
- buffer正确的拼接方式
var chunks = []; var size = 0; res.on('data',function(chunk){ chunks.push(chunk); size+= chunk.lengt ...
- 15. javacript高级程序设计-Canvas绘图
1. Canvas绘图 HTML5的<canvas>元素提供了一组JavaScript API,让我们可以动态的创建图形和图像.图形是在一个特定的上下文中创建的,而上下文对象目前有两种. ...
- 初识 MySQL 5.6 新特性、功能
背景: 之前介绍过 MySQL 5.5 新功能.参数,现在要用MySQL5.6,所以就学习和了解下MySQL5.6新的特性和功能,尽量避免踩坑.在后续的学习过程中文章也会不定时更新. 一:参数默认值的 ...
- ASM:《X86汇编语言-从实模式到保护模式》第8章:实模式下硬盘的访问,程序重定位和加载
第八章是一个非常重要的章节,讲述的是实模式下对硬件的访问(这一节主要讲的是硬盘),还有用户程序重定位的问题.现在整理出来刚好能和保护模式下的用户程序定位作一个对比. ★PART1:用户程序的重 ...
- 为什么使用<!DOCTYPE HTML>
不管是刚接触前端,还是你已经"精通"web前端开发的内容,你应该知道在你写html的时候需要定义文档类型:你知道如果没有它,浏览器在渲染页面的时候会使用怪异模式:你知道各个浏览器在 ...
- 用SSH登录局域网中使用网络设置为NAT的虚拟机中的linux
环境描述: A客户机,安装有putty软件使用SSH方式登录B主机中的虚拟机中的linux:A机的网络地址:192.168.1.2 B主机为Windows7平台,B主机的网络地址为:192.168.1 ...
- springMVC创建基础变量
在springMVC中有一些变量是基础变量,可以在全局多个地方使用,在修改规则的时候,这样只用修改一个地方就好了,而且可以避免很多不必要的bug出现下面就来总结一下在我的项目中如何去创建一个全局基础变 ...
- ssh配置免密码登录
日常工作中很多情况下都需要登录服务器进行管理,一般都是用ssh进行连接,为了防止密码外泄,可以配置下ssh的免密码登录. 首先服务器两台: A:43.224.34.* B:104.238.161.* ...
- 自定义UIDatePikerView
1.添加文件GoYearMonthDayPickerView.h .m .xib.NSDate+Helper.h .m.iCarousel.h .m 2.在Lable上显示日期 UILabel *ag ...