浅谈Android中MVP设计模式
来源:互联网 发布:学士后java课程 编辑:程序博客网 时间:2024/05/08 10:26
1.MVP是众所周知MVC模式的一个演变,他们的主要目的都是划分模块职责,降低模块耦合性,易测试 ,挺高代码复用性。
从不标准的MVC到MVP一个转变,减少了Activity的职责,简化了Activity中的代码,将复杂的逻辑代码提取到Presenter中进行处理,Mvp模式,Presenter的出现,将
Activity视为View层,Presenter负责完成View层与Model层的交互。
1.Model: 负责数据的检索,持久化等操作。
2.View : 负责UI的绘制和用户的交互。
3.Prsenter:作为Model和View的中间协调部分,负责两者之间的业务逻辑处理。
2.与MVC模式的区别
MVP模式与MVC模式从层级数据流向上来说一个主要的区别应该就是:MVC模式允许View层和Model层直接通讯
MVC模式
MVP模式
MVP与MVC的区别
MVC中允许Model和View进行交互的,而MVP中很明显,Model与View之间的交互由Presenter完成,并且Presenter与View之间的交互式通过接口实现。
Demo演练
图(1) mvp目录结构
1.按照mvp模式进行模块划分
首先创建数据层Model层 ,主要工作进行数据的检索与持久化操作
A.创建实体类User ,进行数据建模
package com.qkhl.mvp.mvpdemo.model.bean;
/**
* 作者:gaoyin
* 电话:18810474975
* 邮箱:18810474975@163.com
* 版本号:1.0
* 类描述:
* 备注消息:
* 修改时间:16/7/22 下午3:49
**/
public class User {
private String username;
private String 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;
}
@Override
public String toString() {
return "User{" +
"username='" + username + '\'' +
", password='" + password + '\'' +
'}';
}
}
B.对业务逻辑进行抽象化 ,这里需要进行登录操作,首先创建业务逻辑有关的接口,抽象类中声明需要实现的业务逻辑方法。
package com.qkhl.mvp.mvpdemo.model.biz;
/**
* 作者:gaoyin
* 电话:18810474975
* 邮箱:18810474975@163.com
* 版本号:1.0
* 类描述:
* 备注消息:
* 修改时间:16/7/22
**/
public interface ImpUserBiz {
/**
* 登录方法
* @param username
* @param passwrod
* @param onLoginListener
*/
public void login(String username,String passwrod,LoginListener onLoginListener);
}
C.需要对login方法进行回调监听,所以需要定义接口监听,定义LoginListener接口类
package com.qkhl.mvp.mvpdemo.model.biz;
import com.qkhl.mvp.mvpdemo.model.bean.User;
/**
* 作者:gaoyin
* 电话:18810474975
* 邮箱:18810474975@163.com
* 版本号:1.0
* 类描述:
* 备注消息:
* 修改时间:16/7/22 下午5:07
**/
public interface LoginListener {
// 登录成功
public void loginSuccess(User user);
// 登录失败
public void loginFailed();
}
D.对Model层业务进行实际处理类,所以需要定义实现类UserBiz
package com.qkhl.mvp.mvpdemo.model.biz;
import com.qkhl.mvp.mvpdemo.model.bean.User;
/**
* 作者:gaoyin
* 电话:18810474975
* 邮箱:18810474975@163.com
* 版本号:1.0
* 类描述:
* 备注消息:
* 修改时间:16/7/22 下午4:00
**/
public class UserBiz implements ImpUserBiz {
/**
* 处理登录逻辑
* @param username
* @param passwrod
* @param onLoginListener
*/
@Override
public void login(final String username, final String passwrod, final LoginListener onLoginListener) {
/**
* 校验账号和密码是否正确
*/
new Thread(){
@Override
public void run() {
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
if("gaoyin".equals(username)&&"12345".equals(passwrod))
{
/**
* 登录成功
*/
User mUser=new User();
mUser.setUsername(username);
mUser.setPassword(passwrod);
//回调监听
onLoginListener.loginSuccess(mUser);
}
else
{
/**
* 登录失败
*/
onLoginListener.loginFailed();
}
}
}.start();
}
}
2.对View层进行模块化实现,View主要工作是进行UI和用户交互。
A. 对Activity和Fragment需要实现的业务逻辑进行接口抽取,并声明需要实现业务逻辑的方法。
package com.qkhl.mvp.mvpdemo.view.imp;
import com.qkhl.mvp.mvpdemo.model.bean.User;
/**
* 作者:gaoyin
* 电话:18810474975
* 邮箱:18810474975@163.com
* 版本号:1.0
* 类描述: Activity 业务逻辑接口类
* 备注消息:
* 修改时间:16/7/22 下午4:16
**/
public interface ImpUserLogin {
// 获得用户名称
public String getUserName();
// 获得用户密码
public String getPasswrod();
// 清除用户名称
public void clearUserName();
// 清除用户密码
public void clearPasswrod();
// 登录成功
public void showSuccess(User user );
// 登录失败
public void showFailedError();
}
B.进行UI绘制以及用户交互操作
package com.qkhl.mvp.mvpdemo.view;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
import com.qkhl.mvp.mvpdemo.R;
import com.qkhl.mvp.mvpdemo.model.bean.User;
import com.qkhl.mvp.mvpdemo.presenter.UserLoginPreseter;
import com.qkhl.mvp.mvpdemo.view.imp.ImpUserLogin;
public class MainActivity extends AppCompatActivity implements ImpUserLogin,View.OnClickListener {
// 用户名称
private EditText ed_username;
// 用户密码
private EditText ed_password;
// 登录
private Button btn_login;
// 清除
private Button btn_clear;
// 实例化 业务逻辑类
private UserLoginPreseter mUserLoginPreseter=new UserLoginPreseter(this);
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ed_username=(EditText)this.findViewById(R.id.ed_username);
ed_password=(EditText)this.findViewById(R.id.ed_pwd);
btn_login=(Button)this.findViewById(R.id.btn_login);
btn_clear=(Button)this.findViewById(R.id.btn_clean);
btn_login.setOnClickListener(this);
btn_clear.setOnClickListener(this);
}
@Override
public String getUserName() {
return ed_username.getText().toString();
}
@Override
public String getPasswrod() {
return ed_password.getText().toString();
}
@Override
public void clearUserName() {
ed_username.setText("");
}
@Override
public void clearPasswrod() {
ed_password.setText("");
}
@Override
public void showSuccess(User user) {
Toast.makeText(getApplication(),"登录成功!用户信息为:"+user.toString(),Toast.LENGTH_LONG).show();
}
@Override
public void showFailedError() {
Toast.makeText(getApplication(),"登录失败",Toast.LENGTH_LONG).show();
}
@Override
public void onClick(View v) {
switch (v.getId())
{
// 登录
case R.id.btn_login:
mUserLoginPreseter.login();
break;
// 清除
case R.id.btn_clean:
mUserLoginPreseter.clear();
break;
}
}
}
3.创建Presenter,用于连接Model和View层的桥梁,通过Presenter进行数据和事件传递
package com.qkhl.mvp.mvpdemo.presenter;
import android.os.Handler;
import com.qkhl.mvp.mvpdemo.model.bean.User;
import com.qkhl.mvp.mvpdemo.model.biz.ImpUserBiz;
import com.qkhl.mvp.mvpdemo.model.biz.LoginListener;
import com.qkhl.mvp.mvpdemo.model.biz.UserBiz;
import com.qkhl.mvp.mvpdemo.view.imp.ImpUserLogin;
/**
* 作者:gaoyin
* 电话:18810474975
* 邮箱:18810474975@163.com
* 版本号:1.0
* 类描述: 业务处理--->登录逻辑
* 备注消息:
* 修改时间:16/7/22 下午4:25
**/
public class UserLoginPreseter {
private ImpUserBiz mUserBiz;
private ImpUserLogin mUserLogin;
private Handler mHandler=new Handler() ;
public UserLoginPreseter(ImpUserLogin mUserLogin)
{
this.mUserLogin=mUserLogin;
mUserBiz=new UserBiz();
}
/**
* 登录方法
*/
public void login()
{
mUserBiz.login(mUserLogin.getUserName(), mUserLogin.getPasswrod(), new LoginListener() {
// 登录成功
@Override
public void loginSuccess(final User user) {
// 返回主线程,进行回调
mHandler.post(new Runnable() {
@Override
public void run() {
mUserLogin.showSuccess(user);
}
});
}
// 登录失败
@Override
public void loginFailed() {
mHandler.post(new Runnable() {
@Override
public void run() {
mUserLogin.showFailedError();
}
});
}
});
}
/**
* 清除用户信息
*/
public void clear()
{
mUserLogin.clearUserName();
mUserLogin.clearPasswrod();
}
}
- 浅谈Android中MVP设计模式
- 浅谈Android架构设计模式中MVC、MVP、MVVM
- Android设计模式之浅谈MVP
- Android设计模式之浅谈MVP
- Android设计模式之浅谈MVP
- Android设计模式之浅谈MVP
- Android设计模式之浅谈MVP
- Android设计模式之浅谈MVP
- 浅谈Android MVP 设计模式 (下)
- Android设计模式之浅谈MVP
- Android MVP模式 浅谈
- Android 浅谈Mvp模式
- android 浅谈mvp模式
- 浅谈Android MVP模式
- 浅谈Android MVP模式
- 浅谈Android MVP设计模式(简单结合RxJava+Retrofit)
- 浅谈android的MVP设计模式之内存泄露问题
- Android Mvp设计模式结合RxJava+OkHttp+retrofit浅谈
- hdu 1527 取石子游戏 (威佐夫博奕)
- 写一个宏可以将一个数字的奇数位和偶数位交换。
- Solr 删除索引
- jQuery hover方法
- 使用Gson的JsonReader解析Json数据
- 浅谈Android中MVP设计模式
- [编写高质量iOS代码的52个有效方法](八)内存管理(下)
- 开发者福利:iOS开发学习资源、解决方案大放送
- Swift基础(三十一)UINavigationController
- 红黑树
- html5中article元素的使用方法
- 设置首行缩进
- SQL函数汇总
- iOS 开发中的争议(一)