谈谈对mvp模式的理解

来源:互联网 发布:淘宝发表论文 编辑:程序博客网 时间:2024/05/17 09:21

     刚刚开始写代码的时候,凭着自己的灵感想到什么就写什么,整个项目都是面向过程写下来,一个类就2-3千行代码,满满的成就感。当项目需求变更的时候才知道什么是痛苦,往往一个很小的改动,但是修改的代码确很多,而且不知道会不会出现漏修改的地方或者修改了某一个地方对其他类有没有影响,牵一发动全身,这时候我宁愿项目经理来牵我的头发也不想去修改这堆代码,所以我开始了解mvp开发模式,不再让经理牵我的头发。到底什么是mvp模式?很多人普遍认为代码清晰了同时增加了很多类。也有人会觉得增加那么多类太麻烦了,但是我想说增加很多类会让你的头发不再掉,相信我mvp模式会让你拥有乌黑浓密的秀发。那么mvp模式是怎么样的呢?据我所知肯定是杀人最多、死亡最少、经济最高、推塔无数的王者,嗯,一定是这样的。但。。。惊恐惊恐

     现在是这样的:

View 对应于Activity,负责View的绘制以及与用户交互

Model 依然是业务逻辑和实体模型

Presenter 负责完成View于Model间的交互

  想不到吧,老实说我也想不到,难怪我一直拿不到lol的mvp。下面通过简单的demo来展示下mvp模式。界面如下


项目结构如下


接下来就是如何实现了

首先从最简单的实体类

package com.example.mymvp.entity;public class LoginInfo {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;}}

然后就是modle模型了,这里只有一个login方法

package com.example.mymvp.modle;import com.example.mymvp.entity.LoginInfo;public class LoginModle {public boolean login(LoginInfo l){try {Thread.sleep(3000);if (l.getUsername().equals("123456") && l.getPassword().equals("123456")) {return true;}} catch (InterruptedException e) {e.printStackTrace();}return false;};}

其次就是用于presenter跟view交互的接口了,里面的方法可根据需求自己定义,难点也是设计拥有什么方法,这是mvp模式亮点啊

package com.example.mymvp.listener;import com.example.mymvp.entity.LoginInfo;public interface LoginView {//获取用户名字String getUsername();//获取用户密码String getPassword();//登陆成功void success();//登陆失败void error();//正在加载void loading();//得到登陆信息LoginInfo getLoginInfo();}

最后就是presenter类,作为新英雄到底有什么技能呢,看了界面就知道只有login一个技能了,我不愧是青铜五中的佼佼者。

package com.example.mymvp.presenter;import com.example.mymvp.listener.LoginView;import com.example.mymvp.modle.LoginModle;import android.app.Activity;public class LoginPresenter {private LoginModle loginModle;private LoginView loginView;public LoginPresenter( LoginView loginView) {super();this.loginModle = new LoginModle();this.loginView = loginView;}public void login(){loginView.loading();new Thread(){public void run() {if(loginModle.login(loginView.getLoginInfo())){((Activity)loginView).runOnUiThread(new Runnable() {@Overridepublic void run() {//主线程更新uiloginView.success();}});}else{((Activity)loginView).runOnUiThread(new Runnable() {@Overridepublic void run() {//主线程更新uiloginView.error();}});}};}.start();}}

最后就是activity了

package com.example.mymvp;import com.example.mymvp.entity.LoginInfo;import com.example.mymvp.listener.LoginView;import com.example.mymvp.presenter.LoginPresenter;import android.app.Activity;import android.app.ProgressDialog;import android.os.Bundle;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;import android.widget.EditText;import android.widget.Toast;public class MainActivity extends Activity implements LoginView {private EditText username_et;private EditText password_et;private ProgressDialog dialog;private Button login_bt;private LoginPresenter presenter;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);intiview();presenter = new LoginPresenter(this);login_bt.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {presenter.login();}});}private void intiview() {username_et = (EditText) findViewById(R.id.username_et);password_et = (EditText) findViewById(R.id.password_et);login_bt = (Button) findViewById(R.id.login);dialog = new ProgressDialog(this);}@Overridepublic String getUsername() {return username_et.getText().toString();}@Overridepublic String getPassword() {return password_et.getText().toString();}@Overridepublic void success() {Toast.makeText(MainActivity.this, "登陆成功", Toast.LENGTH_SHORT).show();dialog.dismiss();}@Overridepublic void error() {Toast.makeText(MainActivity.this, "登陆失败", Toast.LENGTH_SHORT).show();dialog.dismiss();}@Overridepublic void loading() {dialog.show();}@Overridepublic LoginInfo getLoginInfo() {// TODO Auto-generated method stubLoginInfo l = new LoginInfo();l.setUsername(getUsername());l.setPassword(getPassword());return l;}}

     好了,整个项目就是这样子的了。以上都是我自己的理解,如有不对的地方还需要大神们多多指教,毕竟我还是青铜五的菜鸟。虽然是个菜鸟但我们也有有一个mvp王者梦。

项目下载地址:http://download.csdn.net/detail/qq819715035/9792059






1 0
原创粉丝点击