【架构】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中,我们跨节点切片数据,然后将查询发送到数据.这是数据库的基本原则之一,它允许随着添加更多节点而几乎线性地扩展. 有关如何分布数据的概念,请参阅数 ... 
随机推荐
- STL vector按多字段值排序
			#include <iostream> #include <vector> #include <string> #include <algorithm> ... 
- progressBar走马灯设置
			初始值Visible = false; 让progressBar1出现时: progressBar1.Visible = true; progressBar1.Style = ProgressBarS ... 
- 在Debian上用Bind 配置DNS服务器
			1 什么是DNS 初学者可能不理解DNS到底是什么,干什么用.我是在1998年大学毕业时才听说这个词的.那时我在聊天室碰到潍坊信息港的一个网管,我恬不知耻地说我也是个网管,他说也维护DNS吗?我说,D ... 
- 2.kvm创建第一个虚拟机
			1.创建一个镜像 [root@kvm ~]# qemu-img create -f raw /opt/Centos_6.6_x86.raw 5G Formatting '/opt/Centos_6.6 ... 
- Match:Cyclic Nacklace(KMP的next数组的高级应用)(HDU 3746)
			串珠子 题目大意:给定一个字串,要你找到如果要使之成为循环串,在末尾需要的最小的字数(只能添加字符,不能删减字符) 首先联动一下之前做过的动态规划问题POJ 3280,当然了3280这一题是用的LD, ... 
- Divide and conquer:4 Values whose Sum is 0(POJ 2785)
			找四个数的和为0 题目大意:给定四个集合,要你每个集合选4个数字,组成和为0 这题是3977的简单版,只要和是0就可以了 #include <iostream> #include < ... 
- HTML表格
			<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ... 
- Maven中手动引用第三方jar包
			有些jar包在Maven库中并不支持,但我们又需要.所以就必须手动引入. 可分为三步完成: 1 ,在项目目录下创建Lib,把引入的jar包加入. 2.在pom.xml中引入dependences. 如 ... 
- hdu 2020
			题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2020 思路:优先队列水过priority_queue #include <cstdio> ... 
- 二、JavaScript语言--JS基础--JavaScript进阶篇--DOM对象 控制HTML元素
			1.认识DOM 文档对象模型DOM(Document Object Model)定义访问和处理HTML文档的标准方法.DOM 将HTML文档呈现为带有元素.属性和文本的树结构(节点树). 先来看看下面 ... 
