MVP实现的步骤梳理


在安卓的开发中,较大项目使用MVP很具有优势,在学习MVP的使用的时候,发现多数文章没有进行总结和归纳抽象,也就是说在使用的时候不知道从哪里开始着手,那么我就来一步一步分析给出自己的想法吧,这里也就不再对MVP进行介绍和比较与MVC的差别了,网上一大把。都是很简单的代码,所以没有注释啦,相信看到MVP的应该可以看懂的~

和大家的一样,项目要实现的只是简单的模拟登录功能(图片都来自网上,代码是自己的 = = ):



Modle:

首先开始分析需要使用的Model:

有Javabean,命名为UserBean:

public class UserBean {	
	public String name ;
	public String psw;
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getPsw() {
		return psw;
	}
	public void setPsw(String psw) {
		this.psw = psw;
	}	
}

因为Model,即处理和数据存储以及对所存储数据的操作有关一一切,所以除了Javabean,还要有对javabean进行处理的一切,这里是UserBiz,可以看到他只对javabean进行操作,用于与业务逻辑联系起来,这里的业务逻辑是与model有关的业务逻辑,也就是登陆:

public class UserBiz implements IUserBiz {

	@Override
	public void login(final String name, final String psw, final OnLoginListener listener) {

		new Thread(new Runnable() {
			
			@Override
			public void run() {
				try{
					Thread.sleep(1000);
				}
				catch(Exception e)
				{	
					e.printStackTrace();
				}
				
				if("andy".equals(name) && "123".equals(psw) &&listener !=null)
				{
					UserBean user = new UserBean();
					user.setName(name);
					user.setPsw(psw);
					
					listener.onSuccess(user);
				}
				else
				{
					listener.onFailusre();
				}
				
			}
		}).start();
	}
}

又因为为了解耦,所以使用到了接口IUserBiz:

public interface IUserBiz {
	void login(String name,String psw,OnLoginListener linstener);
}


注意到里面使用了OnLoginListener,可以理解为回调,因为只有在用户登录输入信息后才需要告诉监听器进行后续操作,所以这里有回调接口用于告诉成功和失败:

public interface OnLoginListener {
	void onSuccess(UserBean bean);
	void onFailusre();
}

在这里model就写完了,完全是围绕javabean进行的活动。我们看到实现由userbean,然后有对userbean操作的方法login在IuserBiz接口里面,后来创建他的实现类,因为实现类里面有回调,创建回调接口,最后完成实现类;

总结起来就是,创建项目相关的javabean,或者说数据库等,然后围绕数据创建对数据进行必要操作的类和接口。


View

接下来对View进行分析:观察界面,针对需要有响应的view,查看此view需要干什么,结果是什么?

这里是四个view,需要set/get name和psw,以及需要clear name和psw,需要login时成功是失败是分别要toMainActivity和showFailure;

所以有接口:

public interface IUserView {
	String getName();
	String getPsw();
	
	void clearName();
	void clearPsw();

	void toMainActivity();
	void showFailuare();
}

本来Activity就是用来实现IUserView的,但是目前无需实现先,先来实现Presenter吧,因为activity需要使用到Presenter,而Presenter只需要前面已经完成的代码即可:

Presenter:

根据分析,presenter用于在model以及view之间作为纽带以进行交互使用,所以presenter有前面的IUserView以及IUserBiz的引用;又根据逻辑model和view通过login和clear进行被链接的,所以可以有方法login和clear方法:

public class IUserPresenter {

	private IUserView uv;
	private IUserBiz ub;
	private Handler mHandler = new Handler();

	public IUserPresenter(IUserView uv) {
		super();
		this.uv = uv;
		this.ub = new UserBiz();
	}

	public void login() {
		ub.login(uv.getName(), uv.getPsw(), new OnLoginListener() {

			@Override
			public void onSuccess(UserBean bean) {
				mHandler.post(new Runnable() {

					@Override
					public void run() {
						uv.toMainActivity();
					}
				});
			}

			@Override
			public void onFailusre() {
				mHandler.post(new Runnable() {
					@Override
					public void run() {
						uv.showFailuare();
					}
				});
			}
		});
	}

	public void clear() {
		uv.clearName();
		uv.clearPsw();
	}
}
可以看到,IUserBiz的方法和IUserView的方法分别在这里进行了相互调用以实现login和clear的功能。


最后再来看View的实现,也就是Activity:

View:
如前面所说,activty就是view的实现,而activity要使用到model和presenter,所以这里在最后才编码activity,实现了前面了View,隉是IUserView:

public class MainActivity extends Activity implements IUserView {

	private EditText et_name;
	private EditText et_psw;
	private Button mBtnClear;
	private Button mBtnLogin;

	IUserPresenter presenter = new IUserPresenter(this);

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);

		initViews();
	}

	private void initViews() {
		et_name = (EditText) findViewById(R.id.et_name);
		et_psw = (EditText) findViewById(R.id.et_psw);

		mBtnLogin = (Button) findViewById(R.id.login);
		mBtnClear = (Button) findViewById(R.id.clear);

		mBtnLogin.setOnClickListener(new OnClickListener() {

			@Override
			public void onClick(View arg0) {

				presenter.login();
			}
		});

		mBtnClear.setOnClickListener(new OnClickListener() {

			@Override
			public void onClick(View arg0) {
				presenter.clear();

			}
		});
	}

	@Override
	public String getName() {

		return et_name.getText().toString();
	}

	@Override
	public String getPsw() {
		return et_psw.getText().toString();
	}

	@Override
	public void clearName() {
		et_name.setText("");

	}

	@Override
	public void clearPsw() {
		et_psw.setText("");
	}

	@Override
	public void toMainActivity() {
		Toast.makeText(getApplicationContext(), "in MainActivity now!", 0)
				.show();

	}

	@Override
	public void showFailuare() {
		Toast.makeText(getApplicationContext(), "failed login!", 0).show();

	}

}

可以看到activity只对view进行了操作,而其他的业务都通过presenter实现。


归纳:

实现步骤,javabean/数据库-》围绕数据进行操作的model-》View的接口-》Presenter接口及实现-》Activity,即View得接口的实现。


结束,大家有任何疑问请留言,谢谢~


参考文章:

http://blog.csdn.net/lmj623565791/article/details/46596109

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值