您的位置:首页 > 其它

MVP模式学习

2016-04-13 17:38 246 查看
最近一段时间在学习H5开发,没有研究android,今天学习了一下MVP设计模式,记录一下。

主要参考了一下文章:贴出链接,以示敬意。

/article/2947953.html

以及

/article/7726609.html

再次表示感谢。

界面完全借鉴,就是简单的三个EditText和两个按钮,这些不是关键,关键在于怎么符合MVP模式。

个人认为最重要的一点就是Model层与View层完全分割开,跟中介类似。举个例子来说,甲有个app项目找到中介乙,报价2万,工期10天,中介乙就找到丙,报价1万6,工期十天。十天后,丙完美完成,把app交给中介乙,拿走1万6。中介乙把app交给甲,拿到2万。在这个过程中,甲和丙没有见过面,完全由乙这个中间商进行各种需求的指定和传递。甲就是View层,丙就是Model层。乙就是P层。

开始贴代码:

首先是MainActivty界面。主要需求是点击保存按钮后,保存一个用户信息。实现接口IView中的setSuccessData(String result)和setFailData(String result)方法。setSuccessData(String result)方法用来处理用户信息保存成功后的各种操作;而setFailData(String result)则用来处理用户信息保存失败的各种操作。

在这个过程中,MainActivity在presenter.save(idString,firstName,secondName)后,不再关心任何其他事情,只需要去处理保存成功或者保存失败就可以了。也就是说公司甲把项目交给乙之后,不管乙是如何实现的,只需要考虑十天后能不能从乙那里拿到app就可以了。(拿到完工的产品,则...;拿不到则...)

public class MainActivity extends AppCompatActivity implements View.OnClickListener,IView{
EditText id, first, second;
Button save, read;

private UserPresenter presenter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
id = (EditText) findViewById(R.id.et_id);
first = (EditText) findViewById(R.id.et_first);
second = (EditText) findViewById(R.id.et_second);

save = (Button) findViewById(R.id.bt_save);
read = (Button) findViewById(R.id.bt_read);
save.setOnClickListener(this);
read.setOnClickListener(this);
presenter = new UserPresenter(this);
}

@Override
public void onClick(View v) {

switch (v.getId()) {
case R.id.bt_save://点击保存
//获取名称
String firstName = first.getText().toString().trim();
String secondName = second.getText().toString().trim();
String idString = id.getText().toString().trim();
//找到presenter,交给presenter
presenter.save(idString,firstName,secondName);
//还需要返回保存的结果
break;
case R.id.bt_read://点击读取
break;
}
}
@Override
public void setSuccessData(String result) {
Toast.makeText(MainActivity.this,result,Toast.LENGTH_SHORT).show();//弹出吐司,提示保存成功,实际项目时替换成其他操作。
}
@Override
public void setFailData(String result) {
Toast.makeText(MainActivity.this,result,Toast.LENGTH_SHORT).show();//弹出吐司,提示保存失败
}
}


然后我们来看一下IView这个接口。

public interface IView {
void setSuccessData(String result);
void setFailData(String result);
}

就这简单的几行代码,仅仅声明成功与失败的方法。当然,实际项目中肯定不止这样,要根据具体需求定。MainActivity(View层)的代码到此结束。我们来看Model层。

Model层只负责业务逻辑的处理,首先定义一个接口IUserModel

public interface IUserModel {

void getData(ISaveSuccessCallBack callBack);

interface ISaveSuccessCallBack {
void OnResult(String result);
}

void getData(ISaveFailCallBack callBack);

interface ISaveFailCallBack {
void OnResult(String result);
}

int save(String id, String firstName, String secondName);
}

然后UserModel实现IUserModel

public class UserModel implements IUserModel {

@Override
public void getData(ISaveSuccessCallBack callBack) {
callBack.OnResult("Success1");
}

@Override
public void getData(ISaveFailCallBack callBack) {
callBack.OnResult("Fail1");
}

@Override
public int save(String id, String firstName, String secondName) {

UserBean user = new UserBean(id,firstName,secondName);//这里进行各种业务逻辑处理

if(id.equals("0")){
return 0;
}
return 1;
}
}

我们来仔细看一下UserModel。它只有三个函数,先来看sava方法,它是用来保存用户信息,可以根据需要进行各种业务逻辑处理。然后id值主要是模拟业务逻辑处理成功和失败的效果。另外两个getData分别用来在业务处理成功与失败后设置返回的数据。也就是说丙也有两种可能,第一种十天完美完成,他就给乙返回success(return 1),没有完成就返回fail.(return 0)

最后来看Presenter

public class UserPresenter {

private IUserModel userModel;
private IView view;

public UserPresenter(IView view) {
userModel = new UserModel();
this.view = view;
}

public void save(String id, String firstName, String secondName) {
//交给IModel
int a = userModel.save(id, firstName, secondName);
if (a == 1) {//a==1,成功
userModel.getData(new IUserModel.ISaveSuccessCallBack() {
@Override
public void OnResult(String result) {
view.setSuccessData(result + "哈哈哈");
}
});
} else {
userModel.getData(new IUserModel.ISaveFailCallBack() {
@Override
public void OnResult(String result) {
view.setFailData(result + "呜呜呜");
}
});
}
}
}


Iview view是在MainActivity中初始化时传递过来的对象,相当于甲。

IUserModel userModel 就相当于丙。

由于从MainActivity中有一个presenter.save(id,firstName,secondName);所以它需要实现这个方法

我们来仔细看一下这个方法。首先第一句:

int a = userModel.save(id, firstName, secondName);

这一句把V层(MainActivity)传递过来要处理的数据直接传递给UserModel,不进行任何处理,也就是甲把开发需求给了中介乙,乙转身直接给了丙。在这个过程中,乙可能完全不会app开发,它只进行管理。返回的a的值就是十天后丙告诉中介乙的信息,乙根据a的值进行判断。如果a=1,中介乙就知道丙完成了,然后就调用丙成功的回调(IsuccessCallback)得到成功的产品,我在这里就用字符串success或者fail代替。而如果a=0了,那么就调用丙失败的回调(IFailCallback)得到一封道歉信或者其他的东西。当然,在通过回调得到信息后,也可以在这里进行处理(当然那也可以不处理),这要看具体需求而定。

注意:在这里,UserModel中的成功与失败我都写成了两个接口来实现,也可以把成功与失败写成一个接口的形式

最后是UserBean忘记贴了:

public class UserBean {

private String id;
private String firstName;
private String secondName;

public UserBean(String id,String firstName, String secondName) {
this.firstName = firstName;
this.id = id;
this.secondName = secondName;
}

public String getFirstName() {
return firstName;
}

public void setFirstName(String firstName) {
this.firstName = firstName;
}

public String getSecondName() {
return secondName;
}

public void setSecondName(String secondName) {
this.secondName = secondName;
}

public String getId() {
return id;
}

public void setId(String id) {
this.id = id;
}
}


(说一点题外话,最近学习H5开发用到了Vue.js,是一个js的MVVM框架,用起来十分好用,用起来特别简单,不是广告,真心推荐。而android的MVVM本人没有做好学习的准备,如果有比较好的MVVM的帖子,还请推荐,谢谢,谢谢,谢谢)

最后附上源码地址:
http://download.csdn.net/detail/u013034413/9490147
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: