美文网首页
MVC MVP MVVM

MVC MVP MVVM

作者: LiLi原上草 | 来源:发表于2017-07-13 11:36 被阅读0次

    复杂的软件必须有清晰合理的架构,否则无法开发和维护!

    MVC(Model-View-Controller)最常见的软件架构之一,业界有这广泛应用。

    后续衍生出了MVP和MVVM架构。

    MVC

    MVC模式的意思是,软件可以分为三个部分。

    1. View传送指令到Controller
    2. Controller完成业务逻辑后,要求Model改变状态
    3. Model将新的数据发送给View,用户得到反馈

    代码展示:

    // 模拟 Model, View, Controller
    var M = {}, V = {}, C = {};
    
    // Model 负责存放数据
    M.data = "hello world";
    
    // View 负责将数据输出到屏幕上
    V.render = (M) => { alert(M.data); }
    
    // ontroller 作为一个 M 和 V 的连接
    C.handleOnload = () => { V.render(M); }
    
    // 在网页加载好的时候呼叫Controller
    window.onload = C.handleOnload;
    

    实例:Backbone

    实际项目往往采用更灵活的方式,以Backbone.js为例。

    1. 用户可以想View发送指令(DOM事件),再由View直接要求Model改变状态。
    2. 用户也可以直接向Controller发送指令(改变URL触发hashChange事件),再由Controller发送给View
    3. Controller非常薄,只起到路由的作用,而View非常厚,业务逻辑都部署在View。所有Backbone索性取消了Controller,只保留了Router(路由器)

    MVP

    MVP 模式将 Controller 改名为 Presenter,同时改变了通信方向。

    1. 各部分之间的通讯,都是双向的
    2. View与Model不发生联系,都通过Presenter传递
    3. View非常薄,不部署任何业务逻辑,称为“被动视图”(Passive View),即没有任何主动性,而Presenter非常厚,所有逻辑都部署在这里

    MVVM

    MVVM 模式将 Presenter 改名为 ViewModel,基本上与 MVP 模式完全一致。

    唯一的区别是,它采用双向绑定(data-binding):View的变动,自动反应在ViewModel,反之亦然。

    Angular和Ember都采用这种模式。

    AngularJS 中的 MVVM

    1. View:专注页面的显示和渲染,在angular中则是包含一堆生命是的视图模板
    2. ViewModel:它是View和Model的粘合体,负责View和Model的交互和协作,它负责给View提供显示的数据,以及提供了View中Command事件操作Model的途径;在angular中$scope对象充当了这个ViewModel的角色
    3. Model:与应用程序业务逻辑相关的数据的封装载体,是业务领域的对象,Model并不关心会被如何显示或操作,所以模型也不会包含任何界面显示相关的逻辑。在web页面中,大部分Model都是来自ajax的服务器端数据或者全局的配置对象;而angular中的service则是封装和处理这些与Model相关的业务逻辑的场所,这类的业务服务是可以被多个Controller或者其它service复用的服务
    4. Controller:并不是MVVM模式的核心元素,但它负责ViewModel对象的初始化,它将组合一个或多个service来获取业务领域Model放在ViewModel对象上,使得应用界面在启动加载的时候可以达到一种可用的状态

    View不能直接与Model交互,而是通过$scope这个ViewModel来实现与Model的交互。

    对于用户界面的交互Command事件(如ngClick、ngChange等)则会转发到ViewModel对象上,通过ViewModel来实现对于Model的改变。然而对于Model的任何改变,也会反应在ViewModel之上,并且会通过$scope的“脏检查机制”($digest)来更新到View。从而实现View和Model的分离,达到对前端逻辑MVVM的分层架构。

    angular中MVVM模式的实现,以领域Model为中心思维,遵循“分离关注点”设计原则,这也是与jQuery以DOM驱动的思维所不同之处。

    相关文章

      网友评论

          本文标题:MVC MVP MVVM

          本文链接:https://www.haomeiwen.com/subject/txzbhxtx.html