众所周知,MVVM模式解决了Controller的臃肿并方便单元测试,为了方便后续代码维护,在上版本新功能开发中,项目开始使用MVVM模式进行开发。

但从上图可以看出,MVVM模式中,Controller即便清爽了,但无疑是将臃肿的代码移到了ViewModel中。

上述上个版本所开发的新功能为“爱疯抢”,从业务交互及界面状态展现来看,有多个界面存在相同的业务交互和元素展现,比如正在疯抢列表、疯抢商品详情、我关注的疯抢、我参与的疯抢等等,这些界面都存在抢拍、提醒、取消提醒、关注、取消关注、购买、支付已抢拍成功商品等业务交互,同时按钮展现(抢拍、提醒等状态切换)及时间展现(抢拍开始时间、抢拍中倒计时、下次抢拍时间)等展示逻辑也无差别。

因此,结合这些具体情形,我在模块类设计时,决定将这些公有的业务交互及界面展现状态转换逻辑抽离出来。依照MVVM设计模式,这些逻辑代码理应放到ViewModel中。

但从实际出发,如果将所有的逻辑的都放进ViewModel,将导致ViewModel变得十分臃肿,同时使得具体业务逻辑代码不够粒度化,这样无疑在代码上耦合严重、不利于代码扩展及重复利用。

举个例子,假如某些界面出现不同的展现方式及逻辑,但却具有相同的业务交互逻辑(抢拍、提醒、关注等),针对这种情况,就不能共用同一个ViewModel来满足了,这时不得不新写一个ViewModel来包含不同的展现逻辑和相同的业务交互逻辑,这无疑导致编写重复的业务交互代码,增加代码维护成本。

为了ViewModel最终不变得臃肿,同时利于代码扩展及重复利用,我想到将ViewModel的职责更进一步细化,ViewModel负责网络请求及界面展示逻辑,而将业务交互部分单独再抽出来,将其封装在独立的业务交互处理类Manager(或许这里取名Manager不恰当,暂且先这样)当中。

这样,不同展现逻辑但具有相同业务交互逻辑的界面即可使用不同的ViewModel而共用同一个Manager了,满足了一份业务交互逻辑代码可以多处使用、多处组装,在一定程度上不仅降低了开发工作量,同时增强了代码的可维护性。

我将这种演化后的模式称为MVVM+Manager模式,简称为MVVMM。Manager既然负责业务交互逻辑,这其中的业务就少不了和服务器交互、和本地数据交互等,因此,MVVMM模式的示意图可以定义为如下所示:

为了更具体说明MVVMM模式各个部分职责,我写了一个简明的逻辑描述Demo供参考。

对于复杂的功能模块,ViewModel仍然显得很臃肿的话,可继续将其职责再细化,例如将网络请求逻辑也从ViewModel中抽离出来单独成为一个处理类,类似猿题库中即使用单独的DataController类来负责网络数据请求,详情可以参考博文

上述有不足或疑问之处请留言交流。

MVVMM Demo:http://download.csdn.net/detail/hbblzjy/9555333

参考文章:

ReactiveCocoa and MVVM, an Introduction

ReactiveCocoa 和 MVVM 入门

猿题库 iOS 客户端架构设计

将 MVVM 演化为 MVVMM的更多相关文章

  1. 我理解的MVC

    前言 前一阶段对MVC模式及其衍生模式做了一番比较深入的研究和实践,这篇文章也算是一个阶段性的回顾和总结. 经典MVC模式 经典MVC模式中,M是指业务模型,V是指用户界面,C则是控制器,使用MVC的 ...

  2. Web安全学习

    项目地址(参考):https://websec.readthedocs.io/zh/latest/basic/history.html 本文只能充当目录简介,具体还要自己深入学习. 序章 Web技术演 ...

  3. [LeetCode] Interleaving String - 交织的字符串

    题目如下:https://oj.leetcode.com/problems/interleaving-string/ Given s1, s2, s3, find whether s3 is form ...

  4. 安全协议系列(五)---- IKE 与 IPSec(上)

    IKE/IPSec 属于网络层安全协议,保护 IP 及上层的协议安全.自上个世纪末面世以来,关于这两个协议的研究.应用,已经非常成熟.协议本身,也在不断地进化.仅以 IKE 为例,其对应的 RFC 编 ...

  5. webpack入门(一)——webpack 介绍

    如今的网站正在演化为web应用程序: 1. 越来越多的使用JavaScript. 2. 现代浏览器提供更广泛的接口. 3. 整页刷新的情况越来越少,甚至更多代码在同一个页面.(SPA) 因此有很多代码 ...

  6. 【Networking】容器网络大观 && SDN 资料汇总

    SDNLAB技术分享(十五):容器网络大观   SDNLAB君• 16-06-17 •2957 人围观 编者按:本文系SDNLAB技术分享系列,本次分享来自SDN撕X群(群主:大猫猫)群直播,我们希望 ...

  7. .net的五层架构

    原文章地址是http://www.360doc.com/content/11/1210/21/19147_171335782.shtml 我们刚开始学习架构的时候,首先会想到分层的概念,分层架构比较经 ...

  8. Mac OS X 背后的故事

    Mac OS X 背后的故事 作者: 王越  来源: <程序员>  发布时间: 2013-01-22 10:55  阅读: 25840 次  推荐: 49   原文链接   [收藏]   ...

  9. H5版定点投篮游戏(1)--物理模型抽象

    前言: 前几天目睹了大学同学开了个微店, 算是间接体验微信公众平台的使用. 觉得非常便捷和方便, 于是自己也想捣鼓一个. 公众号取名: "木目的H5游戏世界", 定位做成一个, 个 ...

随机推荐

  1. OpenCV Python 录制视频

    调用摄像头 引入库支持 初始化 调整界面大小 实时显示 录制视频并保存 fourcc问题解决 代码实现 效果展示 总结 学到实用OpenCV调用笔记本电脑的摄像头,并录制视频保存到本地硬盘的时候,出现 ...

  2. Linux 高性能服务器编程——多进程编程

    问题聚焦:     进程是Linux操作系统环境的基础.     本篇讨论以下几个内容,同时也是面试经常被问到的一些问题:     1 复制进程映像的fork系统调用和替换进程映像的exec系列系统调 ...

  3. linux 服务器网络有关的内核参数

    几乎所有的内核模块,包括内核核心模块和驱动程序,都在/proc/sys 文件系统下提供了某些配置文件以提供用户调整模块的属性和行为.通常一个配置文件对应一个内核参数,文件名就是参数的名字,文件的内容是 ...

  4. EBS多组织结构

    1. 业务组: 它代表组织结构的最高层次, 它分离了人力资源的信息. 例如, 当你查询人员时, 它会列出所有分配给相应业务组的成员, 而你自己所属于的组织只不过是业务组的一份子. 这样说可能造成一种误 ...

  5. 非阻塞IO服务器模型

    我们来考虑一个情形,你跟千千万万个玩家是魔兽世界的超级粉丝,每周末准时组团打boss.每当周末游戏服务器就亚历山大,因为起码几十万用户同时在线.如果用我们的多线程阻塞服务器作为游戏服务器是否可行呢?先 ...

  6. Hive-RCFile文件存储格式

    在新建Hive表时,可以使用stored as rcfile来指定hive文件的存储方式为RCFile. 一.RCFile文件结构 下图是一个RCFile的文件结构形式. 从上图可以看出: 1)一张表 ...

  7. velocity中加载模板文件的方式

    velocity有多中种方式供我们去加载我们自定义的模板文件,下面详细的介绍使用的方法. 1.1.1. 加载classpath目录下的模板文件 使用classpath方式加载,是我们经常用到的一种方式 ...

  8. Ubuntu下配置Telnet服务器

    1. 首先介绍linux中的守护进程 在Linux系统中有一个特殊的守护进程inetd(InterNET services Daemon),它用于Internet标准服务,通常在系统启动时启动.通过命 ...

  9. MySQL 实现调用外部程序和系统命令

    MySQL 实现调用外部程序和系统命令 Refer:http://www.cnblogs.com/yunsicai/p/4080864.html1) Download lib_mysqludf_sys ...

  10. 从浏览器直接转跳到APP具体页面---(魔窗)MagicWindow使用教程

    想要实现在网页里一键调到你APP的指定页面吗,好比打开 JD的一个商品的网页,从网页调到APP这个商品的页面.APP服务化, 使用魔窗SDK可以轻松实现! 老规矩:效果图奉上 1.注册魔窗账号,创建A ...