在安卓的开发中,较大项目使用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