很久以前看到过一篇用饮水机和水桶来比喻RAID几种模式区别的贴子,对这种以日常生活实践来解释复杂专业概念的手法非常喜欢。
今天偶然看到对mvvm的讨论,尤其是与mvc、mvp的比较,突然就想也找个生活例子来比喻,
于是就用人体的概念来类比一下。

内脏、皮肤和大脑

心肝脾肺这些内脏各自承担人体相应机能,自身的负荷健康状态,可以认为是M(数据)
皮肤五官,是人体最外层表象,体内一切东西本身触摸不到,但可以通过观察皮肤来了解内部状态,因此是V(视图),至于皮肤下面的穴位,就当是按钮控件吧:)
大脑,是调度一切的中枢,自然就是C(控制器)了。

M把数据显示在V上: 各处皮肤可以反映不同脏器的状态,比如印堂发黑啦,月牙饱满啦,双眼无神啦,等等。
在V上操作来改变M的状态: 假设脾胃不好,按照中医理论,可以通过刮大拇指来按摩治疗,从而改变了器官的健康状态。

没有MVC的年代

大拇指:『嘿,脾胃,把你的操作接口告诉我,如果有人顺着刮我,我就给你发变好的信号,如果有人倒着刮我,我就给你发变坏的信号!』
脾胃:『我这么重要的数据,你改错了怎么办!』
涌泉穴:『嘿,脾胃,我也要操作你噢,有人按我你就给我精神点。』
脾胃:『……』

V可以直接操作M,特别是多个V都有自己的操作逻辑时,M的状态秩序无从保证,很快混乱到难以维护

MVC

大脑:『大拇指,别人怎么按你,你告诉我就行了,我会给脾胃发出对应的变更指令的。』
大拇指:『知道了,我不用再关注脾胃了,有事就找你。』

MVC解决了V乱操作M的问题,对M的改变只能通过C进行

大脑:『印堂,你作为主窗口,要时刻关注心脏、肾、脾胃的状态,把自己的颜色显示对噢!』
印堂:『我好累……』

MVC的缺点:V直接从M获取信息,对M的依赖太大,很难重用

MVP

大脑:『我改了个名,现在叫P了。』
大伙:『那跟以前有什么区别吗?』
大脑:『是这样的,印堂,你也不用关注那么多器官了,你把你变颜色的接口告诉我,如果跟你相关的器官有问题,我会搞清楚你该变什么颜色,然后通知你变色的!』
印堂:『太好了,我早就不想理它们了。』

MVP的变化:V不再直接从M获取信息并自己来改变外观,而是把改变外观的权力(调用接口)交给P,由P来负责计算何时改变、改变为何值,然后调用该接口来实现。

大脑:『印堂,现在心脏缺氧,你赶快变成青色!』
大脑:『印堂,现在腰肾扭伤,你赶快变成黑色!』
大脑:『印堂,现在心肌紧张焦虑,你赶快凹陷一下!』
大脑:『面颊,现在火毒攻心,你赶快变红色!』
大脑:『眼睛,现在肾气不足,你赶快飞几只蚊子!』
大脑:『我好累……』

MVP的缺点:逻辑都集中到P上,P要处理的事太多,而V减负过头。

MVVM

大脑:『我又改名了,现在叫VM……』
大伙:『到底想怎样?』
大脑:『这样,印堂,以后你的颜色还是要你自己来获取,我不会每次都调你了,但是我会把最新的颜色放在进门左边第一个神经元里,你自己看到变了就来取。』
印堂:『那我就把这个神经元的值绑定到我的颜色属性上了。』
大脑:『面颊,眼睛,你们的XXX属性需要的YYY状态,我都放在第ZZZ个神经元上了,你们也自己来取。』
大伙:『知道了!』
大脑:『还有啊,眼睛,你刚才左眼闭了还是右眼闭了?记得把数据存在第KKK个神经元上,下次我好给你恢复!』
眼睛:『可以有。』
神经元:『给我一句台词行吗!那个叫Binder的就是我啦!』

MVVM的变化:V的变化不再全部由P(现在换叫VM)发起,而是由V自己承担一部份,既不像MVC时代要关注那么多数据源(很累很臃肿),也不像MVP时代那么轻松(太瘦)。
而且对V来说,需要的状态不仅仅是M中的业务数据,也包括仅用于自身显示的UI状态,这些状态合在一起,存放在VM上的一个叫Binder的子对象里,大家适当分工,所有人都满意了。