标签:
转载出:http://kymjs.com/code/2015/11/09/01
1. 为什么需要MVP ?
软件中最核心的,最基本的东西是什么?
答:是的,是数据。我们写的所有代码,都是围绕数据的。
围绕着数据的产生、修改等变化,出现了业务逻辑。
围绕着数据的显示,出现了不同的界面技术。没有很好设计的代码,常常就会出现数据层(持久层)和业务逻辑层还有界面代码耦合的情况。ORM等框架,解耦合了业务逻辑和数据之间的耦合,业务逻辑不再关心底层数据如何存储和读取。所有数据呈现给业务逻辑层的就是一个个的对象。而MVC, MVP, MMVM用来解决业务逻辑和视图之间的耦合。
2. MVC 和 MVP
(1)MVC
MVC全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,一种软件设计典范,用一种业务逻辑、数据、界面显示分离的方法组织代码,将业务逻辑聚集到一个部件里面,在改进和个性化定制界面及用户交互的同时,不需要重新编写业务逻辑。其中M层处理数据,业务逻辑等;V层处理界面的显示结果;C层起到桥梁的作用,来控制V层和M层通信以此来达到分离视图显示和业务逻辑层。说了这么多,听着感觉很抽象,废话不多说,我们来看看MVC在Android开发中是怎么应用的吧!
Model层是一个应用系统的核心部分,代表了该系统实际要实现的所有功能处理。比如:在视频播放器中,模型代表一个视频数据库及播放视频的程序函数代码;在拍照应用中,模型代表一个照片数据库,及看图片时的程序函数代码。在一个电话应用中,Model代表一个电话号码簿,以及拨打电话和发送短信的程序函数代码。
Model在values目录下通过xml文件格式生成,也可以通过硬编码的方式直接Java代码生成。View和Model是通过桥梁Adapter来连接起来。
1 public class ArrayAdapterActivity extends Activity { 2 @Override 3 protected void onCreate(Bundle savedInstanceState) { 4 super.onCreate(savedInstanceState); 5 //界面中的ListView是View,这里通过硬编码的方式直接Java代码生成 6 ListView listView = new ListView(this); 7 // 控制数据怎样在ListView中显示是Controller 8 ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_expandable_list_item_1, getData()); 9 //View和Model是通过桥梁Adapter来连接起来。 10 listView.setAdapter(adapter); 11 setContentView(listView); 12 // 点击事件,Controller负责 13 listView.setOnItemClickListener(new OnItemClickListener() { 14 @Override 15 public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 16 // position是从0开始的,获取点击item的内容 17 Toast.makeText(ArrayAdapterActivity.this, getData().get(position), Toast.LENGTH_SHORT).show(); 18 } 19 }); 20 } 21 // 要显示的数据Model,通过硬编码的方式直接Java代码生成 22 private List<String> getData() { 23 List<String> data = new ArrayList<String>(); 24 data.add("a"); 25 data.add("b"); 26 data.add("c"); 27 data.add("d"); 28 return data; 29 } 30 }
• 视图View和模型Model取资源文件方式:
先在res/layout文件夹下创建文件activity_arrayadapter.xml,可以看出只包含一个ListView,即视图View
1 <?xml version="1.0" encoding="utf-8"?> 2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 3 android:layout_width="fill_parent" 4 android:layout_height="fill_parent" 5 android:orientation="vertical" > 6 <ListView 7 android:id="@+id/listview" 8 android:layout_width="fill_parent" 9 android:layout_height="fill_parent" 10 android:drawSelectorOnTop="false" /> 11 </LinearLayout>
在res/values文件夹下的strings.xml添加一个字符数组,及模型Model
1 <?xml version="1.0" encoding="utf-8"?> 2 <resources> 3 <string-array name="good"> 4 <item>a</item> 5 <item>b</item> 6 <item>c</item> 7 <item>d</item> 8 </string-array> 9 </resources>
Activity代码,在注释中讲解MVC模型使用:
1 public class ArrayAdapterActivity2 extends Activity { 2 @Override 3 protected void onCreate(Bundle savedInstanceState) { 4 super.onCreate(savedInstanceState); 5 setContentView(R.layout.activity_arrayadapter); 6 //界面中的ListView是View,View在layout目录下通过xml文件格式生成,用getViewById()获取 7 ListView listView = (ListView) findViewById(R.id.listview); 8 // 控制数据怎样在ListView中显示是Controller 9 ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_expandable_list_item_1, getData()); 10 //View和Model是通过桥梁Adapter来连接起来。 11 listView.setAdapter(adapter); 12 // 点击事件,Controller负责 13 listView.setOnItemClickListener(new OnItemClickListener() { 14 @Override 15 public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 16 // position是从0开始的,获取点击item的内容 17 Toast.makeText(ArrayAdapterActivity2.this, getData().get(position), Toast.LENGTH_SHORT).show(); 18 } 19 }); 20 } 21 // 要显示的数据Model,Model在values目录下通过xml文件格式生成 22 private List<String> getData() { 23 List<String> data = new ArrayList<String>(); 24 Resources res =getResources(); 25 // 取xml文件格式的字符数组 26 String[] good=res.getStringArray(R.array.good); 27 for(int i=0;i<good.length;i++){ 28 data.add(good[i]); 29 } 30 return data; 31 } 32 }
Android的MVC模式要在项目中慢慢理解,这样才能理解透彻并活学活用。
MVC的优点:
• 耦合性低。所谓耦合性就是模块代码之间的关联程度。利用MVC框架使得View(视图)层和Model(模型)层可以很好的分离,这样就达到了解耦的目的,所以耦合性低,减少模块代码之间的相互影响。
• 可扩展性好。由于耦合性低,添加需求,扩展代码就可以减少修改之前的代码,降低bug的出现率。
• 模块职责划分明确。主要划分层M,V,C三个模块,利于代码的维护。
放在UI的模式和MVC上来讲,就是优化或者替代MVC模式,其中之一就是Model-View-Presenter(MVP)模式。
图 1
图 2
两幅图是不同的,但是对MVC的改进的思想却是一样的:切断的View和Model的联系,让View只和Presenter(原Controller)交互,减少在需求变化中需要维护的对象的数量。
这种方式很符合我们的期待,因为我们倾向于:
• 用更低的成本解决问题
• 用更容易理解的方式解决问题
3. 怎样从架构级别去搭建一个APP,怎样让他应对日益更改的界面与业务逻辑?今天为大家讲述一种在Android上实现MVP模式的方法。
今天为大家讲述一种在Android上实现MVP模式的方法。也是我从新项目中总结出来的一种新的架构模式,大家可以查看我的TheMVP项目:https://github.com/kymjs/TheMVP
Android进阶笔记07:用MVP架构开发Android应用(MVC 和 MVP)
标签:
原文地址:http://www.cnblogs.com/hebao0514/p/4953993.html