Android MVP与MVC框架模式
2016-07-05 15:45
489 查看
MVP与MVC模式
MVC在我们开发过程中比较常见,就不进行详细解释,主要看下二者的区别。(1)MVP与MVC名称上就可以看出来,MVP中使用Presenter代替了之前的Controller,Presenter可以被我们理解为一个中间人,也是主要负责业务逻辑的处理,但是它与Controller又有不同之处。
(2)MVC规范不够明确,MVP规范更加明确,在系统扩展方面也更加灵活。
(3)其实二者最本质的区别是View与Model没有直接联系,通过下面这幅图体现出来的。
拿ListView来讲,以前使用MVC模式的时候通常View指的是一个Activity,但有时候Activity还被作为Controller控制器,虽然MVC模式是想将业务逻辑、数据、界面显示分离但在实际应用中这种分离并不明显,而且通过上图可以看出来,Model与View相互影响,当你的Model(数据)发生改变时可能会影响到View,二者联系还是比较多的(这就是上面所说的规范不够明确)。而在MVP中Presenter作为一个中间人联系这View与Model,当Model改变时并不影响View,如果需要进行修改,只需要在Presenter中进行,从而减少了Model与View的联系,降低了耦合度。
MVP实例
以ListView为例,布局跟Adapter代码不进行展示。
思路:根据MVP模式知道需要有Model、View、Presenter。首先是Model,Model中加载数据(所以demo中有load()方法)、View显示数据(所以demo中写了showview()方法)、Presenter对二者进行绑定(所以demo中有bind()方法),根据上面的MVP模式图可以看出Presenter将持有Model和View,在但在实际开发中考虑可扩展性,一般都是获得Model和View的接口。
Model
接口public interface IFruitModel { void loadFruits(FruitOnloadListener listener); interface FruitOnloadListener{ void onLoadFinish(List<Fruit> fruits); } }
具体数据加载
public class FruitModel implements IFruitModel{ @Override public void loadFruits(FruitOnloadListener listener) { List<Fruit> fruits=new ArrayList<Fruit>(); fruits.add(new Fruit("苹果",R.drawable.ic_btn_speak_now)); fruits.add(new Fruit("苹果",R.drawable.ic_btn_speak_now)); fruits.add(new Fruit("苹果",R.drawable.ic_btn_speak_now)); fruits.add(new Fruit("苹果",R.drawable.ic_btn_speak_now)); fruits.add(new Fruit("苹果",R.drawable.ic_btn_speak_now)); fruits.add(new Fruit("苹果",R.drawable.ic_btn_speak_now)); fruits.add(new Fruit("苹果",R.drawable.ic_btn_speak_now)); fruits.add(new Fruit("苹果",R.drawable.ic_btn_speak_now)); listener.onLoadFinish(fruits); }
View
该接口将被Acivity实现public interface IFruitView { /** * 显示 * @param fruits */ void showFruitView(List<Fruit> fruits); }
Presenter
public class Presenter { // 需要持有View和Model接口 private IFruitView mFruitView; private IFruitModel mFruitModel = new FruitModel(); public Presenter(IFruitView mFruitView) { super(); this.mFruitView = mFruitView; } public void bind() { //进行数据与View的绑定,并回调showview方法, //一般MVC中Activity担任controller,此时MVP中由Presenter回调实现。 mFruitModel.loadFruits(new IFruitModel.FruitOnloadListener() { @Override public void onLoadFinish(List<Fruit> fruits) { mFruitView.showFruitView(fruits); } }); } }
MainActivity
public class MainActivity extends Activity implements IFruitView { private ListView mListView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mListView = (ListView) findViewById(R.id.listview); new Presenter(this).bind(); } @Override public void showFruitView(List<Fruit> fruits) { FruitAdapter adapter = new FruitAdapter(fruits, this); mListView.setAdapter(adapter); } }
这样View与Model没有直接联系。
相关文章推荐
- Android5.0以上版本查看应用使用情况
- 99、Android中定时执行任务的3种实现方法
- 关于getScrollx和getScrolly的理解
- android里TextView加下划线的几种方式
- Android实现基于滑动的SQLite数据分页加载技术(附demo源码下载)
- 关于android camera2的开发小记
- Android实现应用自动更新的方法模块
- Android BGABadgeView:BGABadgeFrameLayout(5)
- Android BGABadgeView:BGABadgeFrameLayout(5)
- Android 加载大量图片
- singleInstance模式下的坑
- android 坑所在
- [置顶] 优秀Android博客大全,整理了国内外大神博客/Github地址,是学习Android进阶的首选[转]
- Android Data Binding(数据绑定)用户指南
- Android Studio导入jar包
- Android 开发最佳实践
- android-Ultra-Pull-To-Refresh上拉下拉结合通用适配器的使用
- android 动态加载机制(备份下)
- android中的adapter模式
- Android Bitmap - Drawable-Byte之间的转换