Android中MVP模式的简单实现
2016-09-03 14:56
375 查看
MVP是怎么来的
讲到MVP首先跟大家讲讲MVC,记得有一次在面试的,公司的一个技术总监问了我一个问题:安卓是如何体现MVC的.我当初回答也是OK,但那个技术总监也是面试完了给了我一个准确答案,应该这么说,首先把MVC的几个层次说一下,
1: Modle:数据模型和业务逻辑
2: View:XML(布局文件)
3: Controller: Activity,Fragment
其中View层和Controller层耦合了,可以说View层是Activity,Fragment这种说法也没错.
有位国外的大牛说过一句话,大多数的Android app用的是仅仅是View_Model框架,也就是少了Controller.
正式因为MVC耦合的原因,所以有了MVP
介绍MVP
* Model: 数据模型和业务逻辑
* View: Acitvity,Fragment
* Presenter: 起来桥梁的作用
Presenter 打个比方 presenter好比一个经济人,Moldel好比一个明星,View 比作一个广告商,广告商要找明星代言广告,明星没有空去处理这个事情但是广告商可以通过联系明星的经济人,然后经济人又跟明星说,代言广告有很多钱赚哦,还没什么坏影响,明星一听,有好多钱赚,接了然后二者就达成交易.
好了现在开始代码一步一步展示出来,先看看登录界面
第一步: Model层 数据模型和业务逻辑
简单,只有一个登录的逻辑
1.1: 登录模型
OnUserLoginListener 是一个接口,就是登录有成功或者失败
1.2: 业务逻辑
第二步:View层
第三步:Presenter层
结束了三个层全部完成,最后附上MainActivity代码
结束,希望对大家有帮助
讲到MVP首先跟大家讲讲MVC,记得有一次在面试的,公司的一个技术总监问了我一个问题:安卓是如何体现MVC的.我当初回答也是OK,但那个技术总监也是面试完了给了我一个准确答案,应该这么说,首先把MVC的几个层次说一下,
1: Modle:数据模型和业务逻辑
2: View:XML(布局文件)
3: Controller: Activity,Fragment
其中View层和Controller层耦合了,可以说View层是Activity,Fragment这种说法也没错.
有位国外的大牛说过一句话,大多数的Android app用的是仅仅是View_Model框架,也就是少了Controller.
正式因为MVC耦合的原因,所以有了MVP
介绍MVP
* Model: 数据模型和业务逻辑
* View: Acitvity,Fragment
* Presenter: 起来桥梁的作用
Presenter 打个比方 presenter好比一个经济人,Moldel好比一个明星,View 比作一个广告商,广告商要找明星代言广告,明星没有空去处理这个事情但是广告商可以通过联系明星的经济人,然后经济人又跟明星说,代言广告有很多钱赚哦,还没什么坏影响,明星一听,有好多钱赚,接了然后二者就达成交易.
好了现在开始代码一步一步展示出来,先看看登录界面
第一步: Model层 数据模型和业务逻辑
简单,只有一个登录的逻辑
1.1: 登录模型
public interface IUserLoginMolder { /** * Model:登录模型 */ void userLogin(String userName ,String passworld,OnUserLoginListener listener); }
OnUserLoginListener 是一个接口,就是登录有成功或者失败
/* * 用户登录回调接口 */ public interface OnUserLoginListener { /** * 登录成功调用 */ void loginSuccess(User user); /** * 登录失败调用 */ void loginError(); }
1.2: 业务逻辑
/** * Model层,用户登录 */ public class UserLogin implements IUserLoginMolder { @Override public void userLogin(String userName, String passworld, OnUserLoginListener listener) { User user = new User(userName,passworld); //登录业务逻辑 if ("text".equals(userName) && "text".equals(passworld)) {//登录成功 listener.loginSuccess(user); } else {//登录失败 listener.loginError(); } } }
/* * @描述: 用户的Bean类 */ public class User { private String userName; private String passworld; public User(String userName, String passworld) { this.userName = userName; this.passworld = passworld; } public String getPassworld() { return passworld; } public void setPassworld(String passworld) { this.passworld = passworld; } public String getUserName() { return userName; } public void setUserName(String userName) { this.userName = userName; } }
第二步:View层
/** * View层,如何实现View层,View层是最复杂的一层 * 1.有什么操作:获取用户名、获取密码 * 2.有什么用户交互:显示滚动条、隐藏滚动条 * 3.有什么结果:登录成功跳转主页、登录失败提示用户 */ public interface IUserLoginView { /**获取用户名*/ String getUsername(); /**获取密码*/ String getPassword(); /**显示滚动条*/ void showProgressbar(); /**隐藏滚动条*/ void hideProgressbar(); /**登录成功跳转主页*/ void jump2Main(User user); /**登录失败提示用户*/ void showLoginError(); }
第三步:Presenter层
/** * Presenter层 * 1.p层既然起到桥梁的作用,p层必须持有model和view层对象(成员变量) * 2.既然起到桥梁的左右,所以需要提供桥梁方法,当前的业务逻辑是登录,所以桥梁方法也是为了登录服务 */ public class UserLoginPresenter implements OnUserLoginListener { UserLoginView mUserLoginView; UserLogin mUserLogin; public UserLoginPresenter(UserLoginView view){ //由于Model和View层没有联系,所以创建对象时只能传一个即View层也就是明星层 mUserLogin = new UserLogin(); mUserLoginView = view; } public void login(){ //登录一进来就展示加载条 mUserLoginView.showDialog(); //开始登录 mUserLogin.userLogin(mUserLoginView.getUserName(),mUserLoginView.getPassword(),this); } /** * 登录成功 * @param user */ @Override public void loginSuccess(User user) { //隐藏加载条 mUserLoginView.hidDialog(); //跳转页面 mUserLoginView.jump2MainActivity(); } /** * 登录失败 */ @Override public void loginError() { //隐藏加载条 mUserLoginView.hidDialog(); //弹一个登录失败的Toast mUserLoginView.loginError(); } }
结束了三个层全部完成,最后附上MainActivity代码
public class MainActivity extends AppCompatActivity implements UserLoginView { private EditText etUsername; private EditText etPassword; private ProgressBar progressBar; private Context context; private Button btnLogin; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.login_activity_mvp); etUsername = (EditText) findViewById(R.id.et_username); etPassword = (EditText) findViewById(R.id.et_password); progressBar = (ProgressBar) findViewById(R.id.progressBar1); btnLogin= (Button) findViewById(R.id.btnLogin); context=this; //创建一个中间层 final UserLoginPresenter presenter = new UserLoginPresenter(this); btnLogin.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { //开始登录 presenter.login(); } }); } @Override public String getUserName() { if (TextUtils.isEmpty(etUsername.getText().toString().trim())) { return ""; } return etUsername.getText().toString().trim(); } @Override public String getPassword() { if (TextUtils.isEmpty(etPassword.getText().toString().trim())) { return ""; } return etPassword.getText().toString().trim(); } @Override public void showDialog() { progressBar.setVisibility(View.VISIBLE); } @Override public void hidDialog() { progressBar.setVisibility(View.GONE); } @Override public void jump2MainActivity() { showToast("跳转到另一个页面"); } @Override public void loginError() { showToast("账号或者密码错误"); } public void showToast(String msg){ Toast.makeText(context, msg, Toast.LENGTH_SHORT).show(); } }
结束,希望对大家有帮助
相关文章推荐
- Android MVP模式的简单实现
- android MVP模式简单介绍
- 一种在android中实现MVP模式的新思路
- Android MVP设计模式的最佳实现
- Android 实现夜间模式的快速简单方法实例详解
- android 单例模式设计简单实现
- android 简单的音乐播放器实现播放模式的切换
- Android实现竖着的滑动刻度尺效果,选择身高(竖向的)Android实现滑动刻度尺效果,选择身高体重和生日------浅谈Andorid开发中的MVP模式
- Android mvp的简单使用和实现
- 浅谈Android MVP设计模式(简单结合RxJava+Retrofit)
- Android 快速简单实现夜间模式
- 【android】夜间模式简单实现
- 安卓中MVP模式和RxAndroid的具体实现例子
- 安卓学习笔记---Android MVP 模式 简单易懂的介绍方式
- android中MVP模式--此模式可以更简单地测试
- 一种在android中实现MVP模式的新思路
- Android MVP 模式:简单易懂的介绍方式
- 【android】夜间模式简单实现
- 梦之鬼索MVP模式在Android中的设计和实现
- 基于MVP开发模式的简单Android项目