版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、 移动端应用系统架构设计这篇文章对于对架构一词不是很了解,或者一知半解的朋友来讲, 梳理一下大局观;并且同样的作为移动开发,IOS与Android的架构差异化并不是很大。从移动端谈架构,其实有点夸大了。因为移动端的项目往往不是很大,或者模块不是很大。一般架构这个词,可能用在Web端比较好一点,也更有效点,架构好了,意味这更稳健的运行效率, 更大体量。从移动端来谈架构,无非是让代码可以优雅一点,解决一下常见的耦合等问题。从Android诞生至今,移动端的架构变更了很多次,从最初的MVC到MVP, 从冷门的Flutter(由RN引入到移动端)到Google的AAC/MVVM;好像架构的思想一直在变
2、,但是大抵都是换汤不换药的,为什么这么说呢 ? 让我们来总结一下。MVCMVPMVVMFlutterAAC以上的架构中MVX系列先不说,剩下的两个是什么? 先来解释一下。Flutter此Flutter非目前炒得火热的Flutter, 而是由React Native衍生而来的,适用于移动端的框架。是的,这也是一种框架思想。Flutter的元素分为3种: View(不必多说), Model(也不必解释吧), Store(这个要说一下,用于处理Action的核心类,类似Presenter的作用), Dispatcher(Action路由), Action(事件)。该框架类似于MVP, 只是通信模块由
3、接口,改为路由系统。AAC(Android Architecture components不知道的可以查看一下官网:/topic/libraries/architecture/guide.html以上是来自官网的AAC-Demo的源码,看结构其实就清楚了,如果允许自己命名的话,或者我们可以称为MVVM了;ViewModel这个模块,是不是像极了Controller或者Presenter。通过以上框架的分析, 我们应该可以得出结论:局部的架构,为什么说是局部架构?因为项目级得架构肯定就是大结构的组件化与插件化。1. 分层从代码的实现解耦。对于现在狭义上的架构,M和V是必然单独的两层,因为数据处理
4、和UI嘛,界限很清楚。难以划分层次的就是逻辑实现,也就是我们的业务处理。而Controller, Presenter, VM这些模块的功能都是一致的所以分层的维度几乎已经确定,就是 数据处理(Model), UI显示(View), 业务处理(X)2. 通信不同的模块,好像层次划分都是一致的,虽然骚气的取了不同的名字。但是区别就在于通信方式。MVC/AAC的通信方式是对象, View与Model的交互是完全通过对象来实现的,如下以上代码是MVC模式, 是不是这么处理的?通过持有对象来达到模块之间的通信。当时可能会觉得这样耦合度比较高,这样就出现了解决方案。于是MVC做成了MVP(哦,当然,那时候
5、还不这么叫),通过接口的方式来通信,或许接口化没那么彻底而已。AAC通过绑定页面的周期做到随页面释放并包装。MVP的通信方式是完全接口式通信, V和P之间,甚至M和P之间也可以。MVP的方式来解释一下,V和P分别实现自己的接口, IV和IP。然后分别传如自己的接口达到调用目的。代码如下:以上是MVP的通信方式,完全的接口相互调用。可能一些架构思维比较前卫的公司,在前期就把MVC改造成了如今的MVP,还是那句话,只是那时候不那么叫罢了。Flutter是以路由机制来实现解耦通信在现在组件化风行的时代,相信各位对路由没那么陌生了。就算不了解, 那么路由器总知道吧,那么先说路由器。路由或路由器,分两个
6、模式: 接收信号, 发出信号。分别是多对一和一对多的关系。举个例子, 现实中的路由器,接收只有一个入口,但发出口有很多个,毕竟如果只有一个出口,那么路由器就没用了。在路由机制中,入口也可以有多个。所以就是上面说的,接收是多对一(一当然是路由器), 发出是一对多(一还是路由器)。简单由一个图来说明一下路由机制,图不是很规整,明白就好。在Flutter模式下,我们如何对应呢?M/V/P或C不同模块之间不能有耦合,即不持有对象,且不持有接口,完全解耦。那么各模块怎么通信呢?通过向路由器发信号。所以M V P/C 都是上图的信号源。M/V/P或C 不同模块要交互,那么怎么得到信号呢? 这时候他们的角色
7、就转变了,不仅可以发信号,也可以接口信号,来做对应处理。 所以M V P/C 也同样是上图的手机(信号接口器)。以上的解释, 不同模块既可以发出信号,也可以接收信号。和Android中的一个组件很相似,就是Handler. Handler既可以发出消息,同时消息又在里面处理。既然有发送信号的, 有接收信号的,那么必然有一个路由器负责接收与发送,在Flutter中就是Dispatcher。Dispatcher保存了不同信号与接收器的对应关系, 以此完成消息的分发。上面都提到了消息,现在正式的介绍一下,消息是角色是Action。看一下Flutter的元素接下来通过代码了解一下public clas
8、s X implements Dispatcher.IReceiver Model model; public X() model = new Model(); Dispatcher.getDispatcher().register(this); public void clearX() model = null; Dispatcher.getDispatcher().unregister(this); Override public void onReceive(Action action) if(.equals(login) model.postLogin(User) action.dat
9、a, new Model.Callback() Override public void onResponse(int result) if(result = 1) / 登录成功 Dispatcher.getDispatcher().sendEvent(new Action(login-success, null); else / 登录失败 Dispatcher.getDispatcher().sendEvent(new Action(login-failed, null); ); public class Action public String name; / 执行动作,比如“登录” pu
10、blic T data; / 数据,比如username, password public Action(String name, T data) = name; this.data = data; public class Dispatcher private static Dispatcher dispatcher = new Dispatcher(); private List receivers = new ArrayList(); private Dispatcher() public static Dispatcher getDispatcher() return dispatch
11、er; public void register(IReceiver receiver) if (receivers.contains(receiver) throw new IllegalStateException(receiver has been registerd yet!); else receivers.add(receiver); public void unregister(IReceiver receiver) if (receivers.contains(receiver) receivers.remove(receiver); public void sendEvent
12、(Action action) if (action != null & != null & .length() 0) for (IReceiver r : receivers) if (r != null) r.onReceive(action); public interface IReceiver void onReceive(Action action); 解析一下以上代码, 首先我们说过, 所有模块既是消息发出者,也是消息接收者。代码中,View和X都分别发出了消息进行登录以及登录结果成功或失败;同时View和X也都注册了接收器的接口,在onReceiver中可以接收消息。这样做的好
13、处是什么? View和X完全没有耦合,既不持有对象, 也不持有接口,中间的通信都是通过Dispatcher进行分发的,解耦已经很彻底了。Dispathcer就是路由器,负责接收,并分发消息,应该很好理解,哪个组件想接收消息,那么就注册一个接收器,这样有合适的消息自然就接收到了。当然,以上的代码有点简陋,可以从不同组件再行封装,比如Action, 比如Dispatcher, 比如BaseView等等。我们可以通过给路由注册机制添加Group与Tag(Action name)概念来优化效率问题,这里只是说思想。我们知道了什么?1. 我称移动端的架构思维为MVX,即是说按这个规则的分工被开发市场所接
14、受了,我们不用费尽心思考虑狭义架构的分层问题了,就沿用Model-View-X来就可以。当然还可以自己加一些辅助的模块层,如Worker负责异步, Converter负责转换, Verify负责校验等2. 移动端目前的架构,差异化在于通信机制。通过以上说明,通信机制主要分为3种:1) 对象持有2) 接口持有3) 路由3. 通信方式中,对象持有是比较原始的,解耦率最低,建议放弃; 接口持有是个不错的选择,极大程度上实现解耦的诉求,但是解耦不彻底,相互持有交互方的接口。 路由机制也是个不错的选择,可以实现完全解耦,就像组件化一样。但是路由机制的设计是个技术难点,怎么设计效率最高?更健壮?代码可查阅性更好?这些都是值得思考的问题。4. 对于路由机制的优化,阿里的ARou
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年青岛市城阳区公务员人员招聘考试备考题库及答案详解
- 高中生物人教版(2019)必修二第6章 第1节 生物有共同祖先的证据 同步测试(含答案)
- 2026年庆阳市西峰区公务员人员招聘考试参考试题及答案详解
- 2025-2026学年处暑的来历说课稿
- 2025年河北省邢台市事业单位人员招聘笔试试题及答案详解
- 2025-2026学年2的减法说课稿
- 2026年山东省枣庄市公务员人员招聘考试参考试题及答案详解
- 2025-2026学年并联的说课稿
- 2026年南宁市良庆区事业单位人员招聘笔试备考题库及答案详解
- 2027华能(福建漳州)热电有限责任公司校园招聘考试备考试题及答案解析
- 2026年甘肃省白银市公安局白银分局招聘警务辅助人员41人笔试参考题库及答案详解
- 婚前医学检查相关知识考核试题(附答案)
- 2026 年烈士纪念日英雄事迹学习专题课件
- Unit3 Smart Learning 单元测试题-人教版英语九年级上册
- 电力系统分析试题与答案
- 煤矿废水处理站建设与运营方案
- 2026年考研政治真题及答案
- 幼儿园大班活动教学设计及教案示范
- 导尿管相关尿路感染(CAUTI)防控最佳护理实践专家共识解读
- 集成电路封装技术(第二版) 课程标准、授课计划
- 高等数学上册同济大学数学系教学课件全套
评论
0/150
提交评论