安卓MVC设计思想(转载)

觉得这个作者理解的很不错,转载过来。
转载地址:http://www.2cto.com/kf/201506/405766.html
框架模式 MVC 在Android中的使用
2015-06-08      0个评论    来源:废墟的树的专栏  
收藏    我要投稿

算来学习Android开发已有2年的历史了,在这2年的学习当中,基本掌握了Android的基础知识。越到后面的学习越感觉困难,一来是自认为android没啥可学的了(自认为的,其实还有很多知识科学),二来网络上的很多框架已经帮我们做了太多的事情了,我们只需要画画UI就可以了,感觉Android开发没有太多的技术含金量。最近闲来无事,开始总结之前学过的知识点,想着是否应该学点其他的东西呢?总不能局限于Android基础知识吧。慢慢的探索发现在大的项目工程中,一个好的框架,好的设计模式,能减少很大的工作量。因此接下来两篇博客来学习一下Android中常用的两种框架设计模式 MVC和MVP。

MVC概念

MVC全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,一种软件设计典范,用一种业务逻辑、数据、界面显示分离的方法组织代码,将业务逻辑聚集到一个部件里面,在改进和个性化定制界面及用户交互的同时,不需要重新编写业务逻辑。其中M层处理数据,业务逻辑等;V层处理界面的显示结果;C层起到桥梁的作用,来控制V层和M层通信以此来达到分离视图显示和业务逻辑层。说了这么多,听着感觉很抽象,废话不多说,我们来看看MVC在Android开发中是怎么应用的吧!

MVC for Android

在Android开发中,比较流行的开发框架模式采用的是MVC框架模式,采用MVC模式的好处是便于UI界面部分的显示和业务逻辑,数据处理分开。那么Android项目中哪些代码来充当M,V,C角色呢?

M层:适合做一些业务逻辑处理,比如数据库存取操作,网络操作,复杂的算法,耗时的任务等都在model层处理。 V层:应用层中处理数据显示的部分,XML布局可以视为V层,显示Model层的数据结果。 C层:在Android中,Activity处理用户交互问题,因此可以认为Activity是控制器,Activity读取V视图层的数据(eg.读取当前EditText控件的数据),控制用户输入(eg.EditText控件数据的输入),并向Model发送数据请求(eg.发起网络请求等)。

接下来我们通过一个获取天气预报数据的小项目来解读 MVC for Android。先上一个界面图:

Controller控制器

?


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

<code class="hljs" java="">package com.xjp.androidmvcdemo.controller;

import android.app.Dialog;

import android.app.ProgressDialog;

import android.os.Bundle;

import android.support.v7.app.ActionBarActivity;

import android.view.View;

import android.widget.EditText;

import android.widget.TextView;

import android.widget.Toast;

import com.xjp.androidmvcdemo.R;

import com.xjp.androidmvcdemo.entity.Weather;

import com.xjp.androidmvcdemo.entity.WeatherInfo;

import com.xjp.androidmvcdemo.model.OnWeatherListener;

import com.xjp.androidmvcdemo.model.WeatherModel;

import com.xjp.androidmvcdemo.model.WeatherModelImpl;

public class MainActivity extends ActionBarActivity implements OnWeatherListener, View.OnClickListener {

    private WeatherModel weatherModel;

    private Dialog loadingDialog;

    private EditText cityNOInput;

    private TextView city;

    private TextView cityNO;

    private TextView temp;

    private TextView wd;

    private TextView ws;

    private TextView sd;

    private TextView wse;

    private TextView time;

    private TextView njd;

    @Override

    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_main);

        weatherModel = new WeatherModelImpl();

        initView();

    }

    /**

     * 初始化View

     */

    private void initView() {

        cityNOInput = findView(R.id.et_city_no);

        city = findView(R.id.tv_city);

        cityNO = findView(R.id.tv_city_no);

        temp = findView(R.id.tv_temp);

        wd = findView(R.id.tv_WD);

        ws = findView(R.id.tv_WS);

        sd = findView(R.id.tv_SD);

        wse = findView(R.id.tv_WSE);

        time = findView(R.id.tv_time);

        njd = findView(R.id.tv_njd);

        findView(R.id.btn_go).setOnClickListener(this);

        loadingDialog = new ProgressDialog(this);

        loadingDialog.setTitle(加载天气中...);

    }

    /**

     * 显示结果

     *

     * @param weather

     */

    public void displayResult(Weather weather) {

        WeatherInfo weatherInfo = weather.getWeatherinfo();

        city.setText(weatherInfo.getCity());

        cityNO.setText(weatherInfo.getCityid());

        temp.setText(weatherInfo.getTemp());

        wd.setText(weatherInfo.getWD());

        ws.setText(weatherInfo.getWS());

        sd.setText(weatherInfo.getSD());

        wse.setText(weatherInfo.getWSE());

        time.setText(weatherInfo.getTime());

        njd.setText(weatherInfo.getNjd());

    }

    /**

     * 隐藏进度对话框

     */

    public void hideLoadingDialog() {

        loadingDialog.dismiss();

    }

    @Override

    public void onClick(View v) {

        switch (v.getId()) {

            case R.id.btn_go:

                loadingDialog.show();

                weatherModel.getWeather(cityNOInput.getText().toString().trim(), this);

                break;

        }

    }

    @Override

    public void onSuccess(Weather weather) {

        hideLoadingDialog();

        displayResult(weather);

    }

    @Override

    public void onError() {

        hideLoadingDialog();

        Toast.makeText(this, 获取天气信息失败, Toast.LENGTH_SHORT).show();

    }

    private <t extends="" view=""> T findView(int id) {

        return (T) findViewById(id);

    }

}

</t></code>

从上面代码可以看到,Activity持有了WeatherModel模型的对象,当用户有点击Button交互的时候,Activity作为Controller控制层读取View视图层EditTextView的数据,然后向Model模型发起数据请求,也就是调用WeatherModel对象的方法 getWeathre()方法。当Model模型处理数据结束后,通过接口OnWeatherListener通知View视图层数据处理完毕,View视图层该更新界面UI了。然后View视图层调用displayResult()方法更新UI。至此,整个MVC框架流程就在Activity中体现出来了。

Model模型

来看看WeatherModelImpl代码实现

?


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

<code class="hljs" java="">

package com.xjp.androidmvcdemo.model;

/**

 * Description:请求网络数据接口

 * User: xjp

 * Date: 2015/6/3

 * Time: 15:40

 */

public interface WeatherModel {

    void getWeather(String cityNumber, OnWeatherListener listener);

}

................

package com.xjp.androidmvcdemo.model;

import com.android.volley.Response;

import com.android.volley.VolleyError;

import com.xjp.androidmvcdemo.entity.Weather;

import com.xjp.androidmvcdemo.volley.VolleyRequest;

/**

 * Description:从网络获取天气信息接口实现

 * User: xjp

 * Date: 2015/6/3

 * Time: 15:40

 */

public class WeatherModelImpl implements WeatherModel {

    @Override

    public void getWeather(String cityNumber, final OnWeatherListener listener) {

        /*数据层操作*/

        VolleyRequest.newInstance().newGsonRequest(http://www.weather.com.cn/data/sk/ + cityNumber + .html,

                Weather.class, new Response.Listener<weather>() {

                    @Override

                    public void onResponse(Weather weather) {

                        if (weather != null) {

                            listener.onSuccess(weather);

                        } else {

                            listener.onError();

                        }

                    }

                }, new Response.ErrorListener() {

                    @Override

                    public void onErrorResponse(VolleyError error) {

                        listener.onError();

                    }

                });

    }

}

</weather></code>

以上代码看出,这里设计了一个WeatherModel模型接口,然后实现了接口WeatherModelImpl类。controller控制器activity调用WeatherModelImpl类中的方法发起网络请求,然后通过实现OnWeatherListener接口来获得网络请求的结果通知View视图层更新UI 。至此,Activity就将View视图显示和Model模型数据处理隔离开了。activity担当contronller完成了model和view之间的协调作用。

至于这里为什么不直接设计成类里面的一个getWeather()方法直接请求网络数据?你考虑下这种情况:现在代码中的网络请求是使用Volley框架来实现的,如果哪天老板非要你使用Afinal框架实现网络请求,你怎么解决问题?难道是修改 getWeather()方法的实现? no no no,这样修改不仅破坏了以前的代码,而且还不利于维护, 考虑到以后代码的扩展和维护性,我们选择设计接口的方式来解决着一个问题,我们实现另外一个WeatherModelWithAfinalImpl类,继承自WeatherModel,重写里面的方法,这样不仅保留了以前的WeatherModelImpl类请求网络方式,还增加了WeatherModelWithAfinalImpl类的请求方式。Activity调用代码无需要任何修改。

MVC使用总结

利用MVC设计模式,使得这个天气预报小项目有了很好的可扩展和维护性,当需要改变UI显示的时候,无需修改Contronller(控制器)Activity的代码和Model(模型)WeatherModel模型中的业务逻辑代码,很好的将业务逻辑和界面显示分离。

Android项目中,业务逻辑,数据处理等担任了Model(模型)角色,XML界面显示等担任了View(视图)角色,Activity担任了Contronller(控制器)角色。contronller(控制器)是一个中间桥梁的作用,通过接口通信来协同 View(视图)和Model(模型)工作,起到了两者之间的通信作用。

什么时候适合使用MVC设计模式?当然一个小的项目且无需频繁修改需求就不用MVC框架来设计了,那样反而觉得代码过度设计,代码臃肿。一般在大的项目中,且业务逻辑处理复杂,页面显示比较多,需要模块化设计的项目使用MVC就有足够的优势了。

4.在MVC模式中我们发现,其实控制器Activity主要是起到解耦作用,将View视图和Model模型分离,虽然Activity起到交互作用,但是找Activity中有很多关于视图UI的显示代码,因此View视图和Activity控制器并不是完全分离的,也就是说一部分View视图和Contronller控制器Activity是绑定在一个类中的。

MVC的优点:

(1)耦合性低。所谓耦合性就是模块代码之间的关联程度。利用MVC框架使得View(视图)层和Model(模型)层可以很好的分离,这样就达到了解耦的目的,所以耦合性低,减少模块代码之间的相互影响。

(2)可扩展性好。由于耦合性低,添加需求,扩展代码就可以减少修改之前的代码,降低bug的出现率。

(3)模块职责划分明确。主要划分层M,V,C三个模块,利于代码的维护。

时间: 2024-10-12 09:42:23

安卓MVC设计思想(转载)的相关文章

MVC 设计思想

MVC 不是一种设计模式,而是一种设计思想 设计模式:是一种固定方法.不灵活,有特定的使用场景 设计思想:是一种思想,比较灵活,有多重设计模式组合实现.  MVC设计思想: V(view):主要功能展示数据,只要有数据即可,不关心数据的来源 M(model):主要功能提供数据(主要用来提供数据并不关心数据要谁显示). C(Controller):主要功能:协调V与M.作为V与M沟通的桥梁(中介).(controller负责给M要数据,然后控制数据让哪个View来显示) Model类 : 存储数据

MVC设计思想,抽象工厂

MVC设计思想:        V(view): 主要功能是展示数据.(主要有数据即可,不关心数据的来源).        M(Model):主要功能提供数据.(主要用来提供数据,并不关心数据让谁显示)     C(Controller):主要功能协调V与M.作为V与M沟通的桥梁.(中介).(Controller负责给M要要数据,然后控制数据让哪一个View来显示)    //抽象工程设计模式    //提供一个抽象的基类(提供基本的功能),使用时使用具体的子类.    //比如UIView ,

讨论Android开发中的MVC设计思想

最近闲着没事,总是想想做点什么.在时间空余之时给大家说说MVC设计思想在Android开发中的运用吧! MVC设计思想在Android开发中一直都是一套比较好的设计思想.很多APP的设计都是使用这套方案完成架构设计的. 谈到MVC我想分为以下几个点分点突进. 1.什么是MVC框架. 2.MVC如何工作 3.MVC的缺点 4.Android之MVC设计模式. 一.什么是MVC框架. MVC英文即Model-View-Controller,即把一个应用的输入.处理.输出流程按照Model.View.

MVC设计思想

MVC是一种软件架构的思想,即把一个应用的输入.处理.输出流程按照Model.View.Controller的方式进行分离: (1)模型: 业务逻辑包含了业务数据的加工与处理以及相应的基础服务(为了保证业务逻辑能够正常进行的事务.安全.权限.日志等等的功能模块): (2)视图:展现模型处理的结果:另外,还要提供相应的操作界面,方便用户使用. (3)控制器:视图发请求给控制器,由控制器来选择相应的模型来处理:模型返回的结果给控制器,由控制器选择合适的视图. jsp+servlet: 优缺点 : 1

转: MVC设计思想简介

模型-视图-控制器(MVC)是80年代Smalltalk-80出现的 一种软件设计模式,现在已经被广泛的使用. 1.模型(Model) 模型是应用程序的主体部分.模型表示业务数据,或者业务逻辑. 2.视图(View) 视图是应用程序中用户界面相关的部分,是用户看到并与之交互的界面. 3.控制器(controller) 控制器工作就是根据用户的输入,控制用户界面数据显示和更新model对象状态. MVC 式的出现不仅实现了功能模块和显示模块的分离,同时它还提高了应用系统的可维护性. 早期的程序中,

深入理解安卓内核设计思想(林学森)

安卓编译篇 安卓原理篇 应用原理篇 安卓系统工具 1 -系统简介 -源码下载及编译 -编译系统 2. -操作系统基础 -安卓进程/线程管理 -进程间通信-binder -安卓启动过程简析 -管理activity和组件运行状态的系统进程 –activity manager service -GUI surface flinger -GUI WMS -GUI View -Inputmanager service -音频系统 3. -Intent 匹配原则 -APK 资源适配 -字符编码格式 -OPE

[javaEE] javaweb的mvc设计思想

Servlet:在Servlet中拼接html内容 JSP:在html中拼接java JSP+JavaBean:利用javaBean将大量的代码提取走 Servlet+JSP+JavaBean:Servlet是控制器,javabean封装数据,jsp展示数据 javaweb的经典三层结构: dao javabean servlet ==> service jsp javabean: javabean是一个遵循特定写法的java类 1.这个java类必须有一个无参的构造函数 2.属性必须私有化 3

剖析安卓build系统的设计思想以及案例模拟

1.引言 安卓系统在根目录中只有一个Makefile文件,每个模块只有一个android.mk文件,这是Makefile文件的一个片段,为什么要这么设计呢?这种设计方式解决了什么问题呢?相信读完本文将会找到这些问题的答案. 2.问题的提出 对于一个小菜鸟来说,最先想到的方案是为每个模块写一个makefile,示例工程如下: Project ----Makefile ----ant ----Makefile ----main.c ----bee ----Makefile ----parse.c -

传统ASP.NET开发和MVC的设计思想

传统ASP.NET开发 第一步:客户端请求服务器: 第二步:服务器从数据库取得数据处理后响应给客户端页面. MVC的设计思想 第一步:客户端请求控制器(里面的一个方法): 第二步:控制器从数据库里取得数据填充到模型里面: 第三步:控制器把模型交给视图: 第四步:视图响应呈现给客户端.