Android中的MVC和MVP(分析+实例)
来源:互联网 发布:p2p网络推广方案ppt 编辑:程序博客网 时间:2024/05/22 07:49
MVC
MVC,我想对于大部分搞过web的应该都不会陌生,但是对于一个android狗来说,似乎,,,什么鬼,往往社么数据库操作,网络操作,直接一坨放在activity里,好点的话,可能是把这些封装下,在activity里调用下,这不还是依赖,代码相比之下简洁了。我们操作数据库和网络,无非就是想从中获得数据,对,数据,如何获得呢?数据库,网络。所以,使得我们activity和网络数据库产生依赖的原因就是因为数据导致了依赖,所以松耦合需要我们通过model来将数据分离,将网络,数据库和数据的获得将其封装.这里通过一个从数据库中读写的例子来进行一个演示。
向数据库中插入一条数据
读出后在activity中展示
常规写法,直接在activity中写数据库的操作,读出数据之后,然后将值给控件进行显示,最开始我都是这么写,甚至是bean都不知道写,用了bean了,感觉数据规范了,但是数据库的操作还是和activity耦合在一起的,也就是对于数据层的处理是混在了controller层。那么我们通过MVC的模式来重写写下。
首先是bean
public class Essay { private String title; private String url; private String page; public void setTitle(String title) { this.title = title; } public void setUrl(String url) { this.url = url; } public void setPage(String page) { this.page = page; } public String getTitle() { return title; } public String getUrl() { return url; } public String getPage() { return page; }}
model层对数据进行封装
public class EssayModel { private Context mContext; public interface OnEssayListener{ void onSuccess(List<Essay> list); void onError(); } public EssayModel(Context context){ mContext = context; } private OnEssayListener mListener; public void getEssay(int num,OnEssayListener listener){ mListener = listener; ArrayList<Essay> list = new ArrayList<Essay>(); SQLiteDatabase db = new DBHelper(mContext).getWritableDatabase(); String sql = "select title,url,page from essay"; String sql1 = "insert into essay (title,url,page) values('This is my essay.','http://www.baidu.com','http://www.baidu.com')"; db.execSQL(sql1); //获取数据 Cursor cursor = db.rawQuery(sql,null); cursor.moveToFirst(); Essay tmp = new Essay(); tmp.setTitle(cursor.getString(0)); tmp.setUrl(cursor.getString(1)); tmp.setPage(cursor.getString(2)); list.add(tmp); listener.onSuccess(list); cursor.close(); db.close(); }}
Activity
public void updateData(){ EssayModel model = new EssayModel(this); model.getEssay(1, new EssayModel.OnEssayListener() { @Override public void onSuccess(List<Essay> list) { esssayInfoTv.setText("标题:"+list.get(0).getTitle()+"文章链接:"+list.get(0).getUrl()); } @Override public void onError() { } }); }
主要目的说明思想,只插入了一条进行演示,代码有些混乱,刚开始写的时候还蒙了一下,通过一个判断游标是否为最后一个向下走,结果报了越界崩掉,好吧,我只插入了一个,它既是第一个也是最后一个(我只猜中了开头,却没有猜中结尾)。在controller层通过监听器注入的方式来实现和数据库相关操作的松耦合,注意,如果model层你写了单例,小心内存泄露哟!!!来个软引用持有吧。
MVP
MVP 是从经典的模式MVC演变而来,它们的基本思想有相通的地方:Controller/Presenter负责逻辑的处理,Model提供数据,View负 责显示。作为一种新的模式,MVP与MVC有着一个重大的区别:在MVP中View并不直接使用Model,它们之间的通信是通过Presenter (MVC中的Controller)来进行的,所有的交互都发生在Presenter内部,而在MVC中View会从直接Model中读取数据而不是通过 Controller。
MVC短板
在MVC里,View是可以直接访问Model的!从而,View里会包含Model信息,不可避免的还要包括一些业务逻辑。 在MVC模型里,更关注的Model的不变,而同时有多个对Model的不同显示,及View。所以,在MVC模型里,Model不依赖于View,但是 View是依赖于Model的。不仅如此,因为有一些业务逻辑在View里实现了,导致要更改View也是比较困难的,至少那些业务逻辑是无法重用的。
简言之,在MVC的基础上,我要将View和数据交互的逻辑部分抽象出来,将这部分逻辑在MVP中继续重新利用,接下来,我们通过MVP的形式将上面的代码重构。
bean无需改变,只需添加Presenter.这里将activity看做了一个view,我们可以声明一个接口或者抽象类,让所有的activity来实现它,这样将activity以view的形式注入到presenter中,然后将逻辑全部转移到presenter中。
Presenter
public class EssayPresenter { private EssayView mView; private EssayModel mEssayModel; public EssayPresenter(EssayView view,Context context) { mView = view; mEssayModel = new EssayModel(context); } public void loadEssay() { Essay essay = new Essay(); essay = mEssayModel.getEssay(); mView.updateData(essay); // 通过调用IUserView的方法来更新显示 }}
Model
public Essay getEssay(){ SQLiteDatabase db = new DBHelper(mContext).getWritableDatabase(); String sql = "select title,url,page from essay"; String sql1 = "insert into essay (title,url,page) values('This is my essay.','http://www.baidu.com','http://www.baidu.com')"; db.execSQL(sql1); Cursor cursor = db.rawQuery(sql, null); cursor.moveToFirst(); Essay tmp = new Essay(); tmp.setTitle(cursor.getString(0)); tmp.setUrl(cursor.getString(1)); tmp.setPage(cursor.getString(2)); cursor.close(); db.close(); return tmp; }
只是修改了下方法。
Activity
EssayPresenter presenter = new EssayPresenter(this,this); presenter.loadEssay(); public void updataData(Essay essay){ esssayInfoTv.setText("标题:" + essay.getTitle() + "文章链接:" + essay.getUrl()); }
相比MVC,MVP中代码已经变得非常简洁了。view层不再和model层存在耦合。MVP主要解决就是把逻辑层抽出来成P层,要是遇到需求逻辑上的更改就可以只需要修改P层了或者遇到逻辑上的大概我们可以直接从写一个P也可以,我们会经常把所有的东西都写在了Activity/Fragment里面这样一来遇到频繁改需求或者逻辑越来越复杂的时候,Activity /Fragment里面就会出现过多的混杂逻辑导致出错,所以MVP模式对于APP来对控制逻辑和UI的解耦来说是一个不错的选择!
不当之处,欢迎路过大神指正批评。
- Android中的MVC和MVP(分析+实例)
- Android中的MVC和MVP(分析+实例)
- Android中的MVC和MVP
- android MVC && MVP && MVVM分析和对比
- android MVC && MVP && MVVM分析和对比
- Android中的MVC和MVP对比
- Android中的MVC和MVP模式
- Android中的MVC,MVP和MVVM
- Android MVC 和 MVP
- 谈谈android中的MVC,MVP和MVVM MVC
- Android中的MVP模式与MVC模式的比较分析
- MVC和MVP在app中的对比分析
- Android架构分析-MVC & MVP
- Android中的MVC与MVP
- Android 中的MVC、MVP、MVVM
- Android之mvp和mvc对比分析以及实际应用
- 小议Android开发中的MVC,MVP和MVVM
- Android中的MVC和MVP模式的简单理解
- C++ 中const的使用总结
- Android 蓝牙技术 带你实现终端间数据传输
- 如何查看已安装的CentOS版本信息
- 关于stm32f0xx中断模式串口只能发不能收的问题,入行必过的第一个坑
- Android手机软键盘遮盖输入框之重新布局详解
- Android中的MVC和MVP(分析+实例)
- 使用diskpart命令修复U盘分区
- char和TCHAR的问题
- boost 时间与日期处理
- 2017年1月计划
- Android 传感器开发 完全解析
- Java ClassLoader基础及加载不同依赖 Jar 中的公共类
- java源文件当中可以有多个类,但是为什么只能有一个public类呢?
- Linux定时器处理之实时信号使用,消息队列阻塞模型,避免超时等待