在Android中使用MVP

本文介绍了MVP(Model View Presenter)模式,它是MVC的进化版,旨在更好地区分视图、模型和用户交互。在MVP模式中,View专注于UI和用户交互,Model处理数据,Presenter作为两者之间的桥梁。与MVC不同,MVP限制Model直接更新View,而是通过Presenter进行。文章提供了一个基于鸿洋大大示例的简化Demo,虽然初始设置较复杂,但在大型项目中优势明显。
摘要由CSDN通过智能技术生成

好吧,最近看到一个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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值