好吧,最近看到一个demo的代码感觉莫名其妙的看不懂,后面才知道使用了mvc,然后顺带着看到了mvp,对比了一下网上的那些评价,就直接去看了下mvp,在这里简单的说一下mvp吧...
注:文章参考了 在Android开发中使用MVP模式、还有鸿洋大大的 浅谈 MVP in Android,在此声明一下,或许我说的引用了他们的一些内容
一、概述:
MVP(Model View Presenter)在我的理解中就是mvc的进化版,mvc开发模式想必大家都有一定的了解,那就直接说mvp吧,为了更好地细分视图(View)与模型(Model)的功能,让View专注于处理数 据的可视化以及与用户的交互,同时让Model只关系数据的处理,基于MVC概念的MVP(Model-View-Presenter)模式应运而生。
在MVP模式里通常包含4个要素:
(1)View:负责绘制UI元素、与用户进行交互(在Android中体现为Activity);
(2)View interface:需要View实现的接口,View通过View interface与Presenter进行交互,降低耦合,方便进行单元测试;
(3)Model:负责存储、检索、操纵数据(有时也实现一个Model interface用来降低耦合);
(4)Presenter:作为View与Model交互的中间纽带,处理与用户交互的负责逻辑。
二、与MVC的差异
mvc中controller和model都可以对view进行操作,而在mvp中,限制了model直接对view的操作,只能通过presenter来进行更新view
三、实例(我的这个实例是按照鸿洋大大的demo来写的,嗯.... 有一些地方被我给简化了,毕竟只要能实现mvp就可以了)
好吧,看起来比直接写登录要复杂,但是当开发大一点的项目的时候就会发现有点还是比弊端多的
package com.example.mvp2.model;
/**
* UserInfo实体类
* */
public class UserInfo {
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;
}
}
package com.example.mvp2.model;
/**
* login接口
* */
public interface IUserBiz {
public void login(String name,String pwd,OnLoginListener loginListener);
}
package com.example.mvp2.model;
/**
* login成功失败监听接口
* */
public interface OnLoginListener {
void loginSuccess(UserInfo userInfo);
void loginFail(String msg);
}
package com.example.mvp2.model;
/**
* 实现login
* */
public class UserBiz implements IUserBiz {
@Override
public void login(final String name, final String pwd,
final OnLoginListener loginListener) {
// TODO 自动生成的方法存根
if ("zx".equals(name) && "zx".equals(pwd)) {
UserInfo userInfo = new UserInfo();
userInfo.setUsername(name);
userInfo.setPassword(pwd);
loginListener.loginSuccess(userInfo);
} else {
loginListener.loginFail("登录失败");
}
}
}
package com.example.mvp2.presenter;
import com.example.mvp2.model.IUserBiz;
import com.example.mvp2.model.OnLoginListener;
import com.example.mvp2.model.UserBiz;
import com.example.mvp2.model.UserInfo;
import com.example.mvp2.view.IUserLoginView;
import android.os.Handler;
/**
* 执行操作
* */
public class UserLoginPresenter {
private IUserBiz userBiz;
private IUserLoginView iLoginView;
public UserLoginPresenter(IUserLoginView iLoginView) {
// TODO 自动生成的构造函数存根
this.iLoginView = iLoginView;
this.userBiz = new UserBiz();
}
public void login() {
userBiz.login(iLoginView.getUsername(), iLoginView.getPassword(),
new OnLoginListener() {
@Override
public void loginSuccess(UserInfo userInfo) {
// TODO 自动生成的方法存根
iLoginView.toLoginSuccess(userInfo);
}
@Override
public void loginFail(String msg) {
// TODO 自动生成的方法存根
iLoginView.toLoginFail(msg);
}
});
}
public void clear(){
iLoginView.clearUsername();
iLoginView.clearPassword();
}
}
package com.example.mvp2;
import com.example.mvp2.model.UserInfo;
import com.example.mvp2.presenter.UserLoginPresenter;
import com.example.mvp2.view.IUserLoginView;
import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
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 IUserLoginView{
private EditText name,pwd;
private Button login,clear;
private UserLoginPresenter persenter = new UserLoginPresenter(this);
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
}
private void initView() {
// TODO 自动生成的方法存根
name = (EditText) findViewById(R.id.name);
pwd = (EditText) findViewById(R.id.pwd);
login = (Button) findViewById(R.id.login);
clear = (Button) findViewById(R.id.clear);
login.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO 自动生成的方法存根
persenter.login();
}
});
clear.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO 自动生成的方法存根
persenter.clear();
}
});
}
@Override
public String getUsername() {
// TODO 自动生成的方法存根
return name.getText().toString();
}
@Override
public String getPassword() {
// TODO 自动生成的方法存根
return pwd.getText().toString();
}
@Override
public void clearUsername() {
// TODO 自动生成的方法存根
name.setText("");
}
@Override
public void clearPassword() {
// TODO 自动生成的方法存根
pwd.setText("");
}
@Override
public void toLoginSuccess(UserInfo info) {
// TODO 自动生成的方法存根
Toast.makeText(getApplicationContext(), info.getUsername() + " 登录成功!", 500).show();
}
@Override
public void toLoginFail(String msg) {
// TODO 自动生成的方法存根
Toast.makeText(getApplicationContext(), msg, 500).show();
}
}
Demo下载地址:http://download.csdn.net/detail/zhaowei_zhang/9395913