Android架构设计模式总结(MVX)

来源:互联网 发布:淘宝儿童化妆品 编辑:程序博客网 时间:2024/05/20 23:58

Android架构设计模式总结(MVX)


一、安卓软件架构设计的目的

通过设计使程序模块化,做到模块内部的高聚合和模块之间的低耦合。这样做的好处是使得程序在开发的过程中,开发人员只需要专注于一点,提高程序开发的效率,并且更容易进行后续的测试以及定位问题。但设计不能违背目的,对于不同量级的工程,具体架构的实现方式必然是不同的,切忌犯为了设计而设计,为了架构而架构的毛病。

举个简单的例子:

一个Android App如果只有3个Java文件,那只需要做点模块和层次的划分就可以,引入框架或者架构反而提高了工作量,降低了生产力;
但如果当前开发的App最终代码量在10W行以上,本地需要进行复杂操作,同时也需要考虑到与其余的Android开发者以及后台开发人员之间的同步配合,那就需要在架构上进行一些思考!

二、MVC、MVP、MVVM架构设计模式的联系与区别

1、MVC(单向循环,每一层都做两件事,先接受命令再通知)

什么是MVC?

MVC:Model View Controller,是软件架构中最常见的一种框架

View:对应于布局文件,一般采用XML文件进行界面的描述Model:对应于安卓中的database、实体类等,负责业务逻辑的处理和实体模型;Controllor:对应于Activity与Fragment,处理数据、业务和UI;

特点:

View可以与Model直接交互。 Controller是基于行为的,并且可以被多个View共享。 

原理:

当用户触发事件的时候,view层会发送指令到controller层,接着controller去通知model层更新数据,model层更新完数据以后直接显示在view层上。

2、MVP

什么是MVP?

在实际运用中人们发现View和Model之间的依赖还是太强,希望他们可以绝对独立的存在,慢慢的就演化出了MVP,Presenter 替换掉了Controller,不仅仅处理逻辑部分,而且还控制着View的刷新,监听Model层的数据变化。这样隔离掉View和Model的关系后使得View层变的非常的薄,没有任何的逻辑部分又不用主动监听数据,被称之为“被动视图”。

View: 对应于Activity和XML文件,负责View的绘制以及与用户交互 Model: 依然是业务逻辑和实体模型 Presenter: 负责完成View于Model间的交互和业务逻辑,不仅负责业务处理还控制着view的刷新

特点:

View不直接与Model交互,而是通过与Presenter交互来与Model间接交互。Presenter与View的交互是通过接口来进行的。通常View与Presenter是一对一的,但复杂的View可能绑定多个Presenter来处理逻辑。

原理:

举个简单的例子,UI层通知逻辑层(Presenter)用户点击了一个Button,逻辑层(Presenter)自己决定应该用什么行为进行响应,该找哪个模型(Model)去做这件事,最后逻辑层(Presenter)将完成的结果更新到UI层。

3、MVVM

说到Android MVVM,相信大家都会想到Google 2015年推出的DataBinding框架。然而两者的概念是不一样的,不能混为一谈。MVVM是一种架构模式,而DataBinding是一个实现数据和UI绑定的框架,是构建MVVM模式的一个工具。

Model:代表你的基本业务逻辑和实体模型,也就是数据源View:对应于Activity和XML,负责View的绘制以及与用户交互,显示内容ViewModel:ViewModel是Model和View的中介,负责处理视图逻辑。通常,ViewModel通过调用Model中的方法与Model交互。然后,ViewModel以一种View很容易地使用的形式提供来自Model的数据。ViewModel从模型中检索数据并将数据提供给视图,并可能重新格式化数据以某种方式使它的视图来处理更简单。视图模型还提供了应用程序的用户在视图中启动的命令的实现

特点:

低耦合 。 视图(View)可以独立于Model变化和修改,一个ViewModel可以绑定到不同的"View"上,当View变化的时候Model可以不变,当Model变化的时候View也可以不变。可重用性 。 你可以把一些视图逻辑放在一个ViewModel里面,让很多view重用这段视图逻辑。独立开发 。 开发人员可以专注于业务逻辑和数据的开发(ViewModel),设计人员可以专注于页面设计。可测试 。 界面素来是比较难于测试的,而现在测试可以针对ViewModel来写。

原理

Android中MVVM的实现要借助Google提出的DataBinding库实现。首先viewmodel与view层通过DataBinding双向绑定,一个更新另一个也跟着更新。model提供数据,viewmodel通过model提供的接口方法进行数据操作,并在view层显示出来。

具体实现

1、添加DataBinding的依赖–在app级的module中添加

//绑定DataBinding库dataBinding {enabled true}

2、布局实现上的区别–根标签是layout,在中添加变量

<?xml version="1.0" encoding="utf-8"?><layout xmlns:android="http://schemas.android.com/apk/res/android"><data>    <variable        name="user2"        type="com.metashipanwf.mvvmtest.model.User2" /></data><LinearLayout    android:layout_width="match_parent"    android:layout_height="wrap_content"    android:orientation="horizontal"    android:padding="10dp">    <TextView        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:text="@{user.firstName}" />    <TextView        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:text="@{user.lastName}" />    <TextView        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:text='@{user.age+""}' /></LinearLayout></layout>

3、添加如上布局之后自动生成binding类,在布局对应的activity中绑定数据

public class MainActivity extends AppCompatActivity {  private ActivityMainBinding binding;  @Override  protected void onCreate(Bundle savedInstanceState) {    super.onCreate(savedInstanceState);    binding = DataBindingUtil.setContentView(this, R.layout.activity_main);    User user = new User("Micheal", "Jack");    binding.setUser(user);  }}

三、参考网址

http://cache.baiducontent.com/c?m=9f65cb4a8c8507ed4fece763105392230e54f7636d918d027fa3c215cc7902155a66e1b823201619d4c77d610aad5e5c9daa702d691765eadb9e875dadb985582f9f5131676cf25613a346eb8f1932c050872a98b86f96ad803984ded9c4de2444bc57120c82e78a2a1765cb78806026e2d68e3e154860cafa3115e829773ee82257b737ee9037797686e1dc2c5bb259c7111180de34a74e14&p=ce759a45d5c100fc57efc8265048bb&newp=c662c31286cc41ac5ab2d62d0214cd231610db2151d4d201298ffe0cc4241a1a1a3aecbf26281100d3c47b6202a8495ae8f03273330834f1f689df08d2ecce7e70ca&user=baidu&fm=sc&query=%B0%B2%D7%BFmvvm%BC%DC%B9%B9%D6%D0%C3%BF%D2%BB%B2%E3%B7%C5%CA%B2%C3%B4%A1%A2&qid=d9f8ec8900001a0d&p1=4http://blog.csdn.net/zh394759565/article/details/51613831http://mp.weixin.qq.com/s?__biz=MjM5NDkxMTgyNw==&mid=405212572&idx=1&sn=e2a84186dccc7661e0644feb38d74f8c&scene=21#wechat_redirecthttp://tech.meituan.com/android_mvvm.html   

微软解释

https://msdn.microsoft.com/en-us/library/hh848246.aspx

DataBinding

https://realm.io/cn/news/data-binding-android-boyar-mount/

郭霖关于mvvm的解读

http://mp.weixin.qq.com/s?__biz=MzA5MzI3NjE2MA==&mid=2650236908&idx=1&sn=9e53f42e18a81795ef0cfe6fe3959ec2&scene=24&srcid=0910cK3vXJpNzY0CO28i1Qhs#wechat_redirect

四、其他网站

1、用 Retrofit 2 简化 HTTP 请求

https://realm.io/cn/news/droidcon-jake-wharton-simple-http-retrofit-2/

2、RxJaba详解

http://gank.io/post/560e15be2dca930e00da1083

3、完全掌握Android Data Binding

http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2015/0603/2992.html

4、mvvm

http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2016/0414/4143.html

5、Android APK反编译就这么简单 详解(附图)

http://blog.csdn.net/vipzjyno1/article/details/21039349
0 0
原创粉丝点击