博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
<Android 基础(三)> MVP模式
阅读量:5931 次
发布时间:2019-06-19

本文共 4785 字,大约阅读时间需要 15 分钟。

前言

MVP,这里指的并不是篮球比赛中的MVP(最有价值球员),而是一种代码框架和设计思想,它是由MVC演变而来的。

MVP模式(Model-View-Presenter)
是MVC模式的一个衍生。主要目的是为了解耦,使项目易于维护。
Model 是业务逻辑和实体模型
View 是包含Presenter的引用。所要做的就是当有交互时,调用Presenter里的对应方法。通常会通过Activity实现
Presenter 是负责完成View于Model间的交互,从Model里取数据,返回给View处理好的数据。

这里写图片描述

MVC模式(Model-View-Controller)

主要目的是讲显示逻辑和业务逻辑独立出来
Model 是应用程序中用于处理应用程序数据逻辑的部分。
View 是应用程序中处理数据显示的部分。
Controller 是应用程序中处理用户交互的部分

这里写图片描述

从构造图上可以看到最主要的差异就是

MVC中是允许Model和View进行交互的,而MVP中很明显,Model与View之间的交互由Presenter完成。还有一点就是Presenter与View之间的交互是通过接口的

MVP使用方法

代码结构

这里写图片描述

代码内容

LoginActivity.java

public class LoginActivity extends AppCompatActivity implements ILoginView {
@Bind(R.id.usernameWrapper) TextInputLayout usernameWrapper; @Bind(R.id.passwordWrapper) TextInputLayout passwordWrapper; @Bind(R.id.bt_clear) Button btClear; @Bind(R.id.bt_login) Button btLogin; private LoginPresenterCompl loginPresenterCompl; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_login); ButterKnife.bind(this); loginPresenterCompl = new LoginPresenterCompl(this); } @OnClick({R.id.bt_clear, R.id.bt_login}) public void onClick(View view) { String username = usernameWrapper.getEditText().getText().toString(); String password = passwordWrapper.getEditText().getText().toString(); switch (view.getId()) { case R.id.bt_clear: loginPresenterCompl.clearText(); break; case R.id.bt_login: loginPresenterCompl.doLogin(username, password); break; } } @Override public void onLoginResult(boolean isLogged) { if (isLogged) { Toast.makeText(this, "Logged in Successfully", Toast.LENGTH_SHORT).show(); } else { Toast.makeText(this, "Logged Failed", Toast.LENGTH_SHORT).show(); } return; } @Override public void onClearText() { usernameWrapper.getEditText().setText(""); passwordWrapper.getEditText().setText(""); usernameWrapper.clearFocus(); passwordWrapper.clearFocus(); InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); if (imm != null) { imm.hideSoftInputFromWindow(getWindow().getDecorView().getWindowToken(), 0); } }}

LoginActivity实现ILoginView接口

public interface ILoginView {    void onLoginResult(boolean isLogged);    void onClearText();}

LoginPresenterCompl.java实现ILoginPresenter接口

public class LoginPresenterCompl implements ILoginPresenter{
private ILoginView iLoginView; Handler handler; public LoginPresenterCompl(ILoginView loginView) { iLoginView = loginView; handler = new Handler(Looper.getMainLooper()); } @Override public void doLogin(String username, String password) { final String tp_username = username; final String tp_password = password; new Thread(new Runnable() { @Override public void run() { boolean isLogged = false ; if(UserModel.isValidUser(tp_username , tp_password)) { isLogged = true; } final boolean tp_isLogged = isLogged; handler.post(new Runnable() { @Override public void run() { iLoginView.onLoginResult(tp_isLogged); } }); } }).start(); } @Override public void clearText() { new Thread(new Runnable() { @Override public void run() { handler.post(new Runnable() { @Override public void run() { iLoginView.onClearText(); } }); } }).start(); }}
public interface ILoginPresenter {    void doLogin(String username, String password);    void clearText();}

UserModel.java这个没有怎么使用,但是实际使用过程中不同的Model会有不同的处理方式

public class UserModel {    public String username;    public String password;    public UserModel(String username, String password) {        this.username = username;        this.password = password;    }    public String getUsername() {        return username;    }    public void setUsername(String username) {        this.username = username;    }    public String getPassword() {        return password;    }    public void setPassword(String password) {        this.password = password;    }    public static boolean isValidUser(String username, String password){        return (username.equals("guagua") && password.equals("guagua"));    }}

简约类图:

这里写图片描述

效果图

这里写图片描述这里写图片描述

转载于:https://www.cnblogs.com/lanzhi/p/6467203.html

你可能感兴趣的文章
NDK 编译问题 总结
查看>>
复习日记-SQL+连接池
查看>>
hdu 1007 Quoit Design
查看>>
织梦(dedecms)如何清空全部文章和删除后新增文章id号归1的方法
查看>>
认识EasyUI——DataGrid的onClickRow事件
查看>>
Android Studio的使用(四)--生成Get、Set方法
查看>>
删除底部"自豪地采用 WordPress"
查看>>
i897刷机原理分析
查看>>
第二次作业
查看>>
JS判断IE浏览器的最简短方法
查看>>
SCAU 2018 初出茅庐 题解
查看>>
Python 正则表达式爬取浏览目录
查看>>
Spring Boot脚手架
查看>>
python 多线程编程之进程和线程基础概念
查看>>
(一)cacti的原理
查看>>
基与维数
查看>>
BZOJ 3295 [Cqoi2011]动态逆序对 ——CDQ分治
查看>>
crosses initialization of “XXX” 的问题
查看>>
linux 入门
查看>>
JS常用几种存储方式的使用规则与各自特征
查看>>