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就可以了。(拿到完工的产品,则...;拿不到则...)
然后我们来看一下IView这个接口。
就这简单的几行代码,仅仅声明成功与失败的方法。当然,实际项目中肯定不止这样,要根据具体需求定。MainActivity(View层)的代码到此结束。我们来看Model层。
Model层只负责业务逻辑的处理,首先定义一个接口IUserModel
然后UserModel实现IUserModel
我们来仔细看一下UserModel。它只有三个函数,先来看sava方法,它是用来保存用户信息,可以根据需要进行各种业务逻辑处理。然后id值主要是模拟业务逻辑处理成功和失败的效果。另外两个getData分别用来在业务处理成功与失败后设置返回的数据。也就是说丙也有两种可能,第一种十天完美完成,他就给乙返回success(return 1),没有完成就返回fail.(return 0)
最后来看Presenter
Iview view是在MainActivity中初始化时传递过来的对象,相当于甲。
IUserModel userModel 就相当于丙。
由于从MainActivity中有一个presenter.save(id,firstName,secondName);所以它需要实现这个方法
我们来仔细看一下这个方法。首先第一句:
这一句把V层(MainActivity)传递过来要处理的数据直接传递给UserModel,不进行任何处理,也就是甲把开发需求给了中介乙,乙转身直接给了丙。在这个过程中,乙可能完全不会app开发,它只进行管理。返回的a的值就是十天后丙告诉中介乙的信息,乙根据a的值进行判断。如果a=1,中介乙就知道丙完成了,然后就调用丙成功的回调(IsuccessCallback)得到成功的产品,我在这里就用字符串success或者fail代替。而如果a=0了,那么就调用丙失败的回调(IFailCallback)得到一封道歉信或者其他的东西。当然,在通过回调得到信息后,也可以在这里进行处理(当然那也可以不处理),这要看具体需求而定。
注意:在这里,UserModel中的成功与失败我都写成了两个接口来实现,也可以把成功与失败写成一个接口的形式
最后是UserBean忘记贴了:
(说一点题外话,最近学习H5开发用到了Vue.js,是一个js的MVVM框架,用起来十分好用,用起来特别简单,不是广告,真心推荐。而android的MVVM本人没有做好学习的准备,如果有比较好的MVVM的帖子,还请推荐,谢谢,谢谢,谢谢)
最后附上源码地址:
http://download.csdn.net/detail/u013034413/9490147
主要参考了一下文章:贴出链接,以示敬意。
/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
相关文章推荐
- mybatis常见异常总结之一0413
- ListView优化方案
- java持有对象map(三)-对象化计数
- 第七周项目4:用多文件组织多个类的程序(1)
- 团队计划backlog
- NSBundle
- HDU 5228 ZCC loves straight flush 暴力
- Linux Shell脚本教程
- jquery格式化时间
- 二叉树中和为某一值的路径
- 要看的文章(不定期更新)
- U盘安装Windows 10和Ubuntu Linux双系统图解教程
- POJ 2019(二维RMQ)
- getLastKnownLocation 返回null
- stopPropagation, preventDefault 和 return false 的区别
- CardVIew 卡片式布局
- hive中的一些基本问题解决方法
- iOS 警告收录及科学快速的消除方法
- 一款基于HTML5的Web 3D开发工具
- Socket通讯