码迷,mamicode.com
首页 > 移动开发 > 详细

Android进阶笔记07:用MVP架构开发Android应用(MVC 和 MVP)

时间:2015-11-10 20:46:51      阅读:326      评论:0      收藏:0      [点我收藏+]

标签:

转载出: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层是一个应用系统的核心部分,代表了该系统实际要实现的所有功能处理。比如:在视频播放器中,模型代表一个视频数据库及播放视频的程序函数代码;在拍照应用中,模型代表一个照片数据库,及看图片时的程序函数代码。在一个电话应用中,Model代表一个电话号码簿,以及拨打电话和发送短信的程序函数代码。

  Model在values目录下通过xml文件格式生成,也可以通过硬编码的方式直接Java代码生成。View和Model是通过桥梁Adapter来连接起来。

    • View层:应用层中处理数据显示的部分,XML布局可以视为V层,显示Model层的数据结果。 View是软件应用传送给用户的一个反馈结果。它代表软件应用中的图形展示、声音播放、触觉反馈等职责。视图的根节点是应用程序的自身窗口。比如,视频播放器中可能包含当前播放的画面,这个画面就是一个视图。另一个视图组件可能是该视频的文字标题。再一个就是一些播放按键,比如:Stop、Start、Pause等按钮。
    • Controller层:在Android中,Activity处理用户交互问题,因此可以认为Activity是控制器,Activity读取V视图层的数据(eg.读取当前EditText控件的数据),控制用户输入(eg.EditText控件数据的输入),并向Model发送数据请求(eg.发起网络请求等)。Controller在软件应用负责对外部事件的响应,包括:键盘敲击、屏幕触摸、电话呼入等。Controller实现了一个事件队列,每一个外部事件均在事件队列中被唯一标识。框架依次将事件从队列中移出并派发出去。
 
 
-----------------------------------------------MVC典型例子的实现ListView-----------------------------------------
Android中最典型MVC是ListView,要显示的数据是Model,界面中的ListView是View,控制数据怎样在ListView中显示是Controller。
 
 技术分享• 通过硬编码的方式直接Java代码生成方式,这里直接在注释讲解:
 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三个模块,利于代码的维护。

 
(2)MVP

       放在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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!