• 简述 MVC, MVP, MVVM三种模式


    Make everything as simple as possible, but not simpler — Albert Einstein*

    把每件事,做简单到极致,但又不过于简单 - 阿尔伯特·爱因斯坦

    何为设计模式

    • 具有某种重复性规律的方案,就是设计过程中可以反复使用的、可以解决特定问题的设计方法
    • 设计模式是针对特定上下文的特定问题的解决方案,这种解决方案被抽象化、模版化,就是设计模式
    • 是一种解决问题的思维,而并非某种特定的方法

    其实这三个解释是一个意思,只是给出不同的说法帮助理解这个抽象的概念。

    为什么用设计模式

    • 设计模式也可以帮助你提升思考架构的层次到模式层面,而不是停留在琐碎的对象上。
    • 方便交流, 把隐形知识清晰地表达出来, 而不在于编码路线图。
    • 让项目在庞大之后结构还是能非常清晰,不让代码失控。
    • 显得专业,更加装X (呵呵)

    OO(面向对象)设计原则

    • 找出应用中可能需要变化之处,把它们独立出来, 不要和那些不需要变化的代码混在一起。这是我们的第一个设计原则。
    • 针对接口编程,而不是针对实现编程。
    • 多用组合,少用继承。

    OOP(面向对象编程)原则

    名称 简介
    单一职责 原则 类的职责要单一,不能将太多的职责放在一个类中
    开闭原则 软件实体对扩展是开放的,但对修改是关闭的,即在不修改一个软件实体的基础上去扩展其功能
    里氏代换原则 在软件系统中,一个可以接受基类对象的地方必然可以接受一个子类对象
    依赖倒转原则 要针对抽象层编程,而不要针对具体类编程
    接口隔离原则 使用多个专门的接口来取代一个统一的接口
    合成复用原则 在系统中应该尽量多使用组合和聚合关联关系,尽量少使用甚至不使用继承关系
    迪米特法则 一个软件实体对其他实体的引用越少越好,或者说如果两个类不必彼此直接通信,那么这两个类就不应当发生直接的相互作用,而是通过引入一个第三者发生间接交互

    MV(X)

    • Models(模型)数据层,负责处理数据,数据接口层
    • Views(视图)展示层(GUI) 负责创建与展示 UI
    • Controller、Presenter、ViewModel 主要是用来负责Model 和 View的沟通。

    MVC 设计模式

    mvc.png

    以 IOS 开发为例,这里的 Controller 其实是 UIViewController。

    这个是理想中的模型,但是在实际开发过程中,并没有想象中那样清晰。我们很多人都会觉的这个模式下的 UIViewController 太臃肿了,而且大大降低了 Contrlller 的重用性。我们在用这个模式的时候可能很多时候都是在考虑这样一个问题,网路请求到底是 Model 负责还是 Controller 负责。

    View和 Model 是相互独立的这点很好,可以方便后来的单元测试。但是,我们一般会把复杂的业务逻辑放到 Controller 里面,这造成了很难去测试 Controller 。IOS 开发中 View 的整个生命周期都是需要 Controller 来管理,这就造成了 View 和 Controller 之间存在严重的耦合现象,在项目庞大之后看起来会特别散乱。

    MVP模式

    mvp.png

    以 IOS 开发为例,这里的 View 其实是 UIViewController。

    它是由 MVC 演变而来的,最大的变化莫过于上面这句话。对 MVP 的 Presenter 根本不用关心 ViewController 的生命周期,所以在 Presenter 里面几乎没有涉及到 UI 的代码,我们所有的 UI 处理全部放到了 UIViewController 里面,这样的话很符合之前说的单一职责。

    这里要强调一下 MVP 模式的是双向通信的,我们看一段代码

    // Assembling of MVP
    let model = Person(firstName: "David", lastName: "Blaine")
    let view = GreetingViewController()
    let presenter = GreetingPresenter(view: view, person: model)
    view.presenter = presenter
    

    在这里面 presenter 同时持有 Model 和 View 两个对象,当用户操作 View 然后调用 Presenter 来改变 Model,Model 更新完毕后,presenter 调用 View 的方法来更新 UI。

    MVVM模式

    mvvm.png

    以 IOS 开发为例,这里的 View 其实是 UIViewController。

    这个模式完全是由 MVP 进化过来的,它和 MVP 的不同点在于 ViewModel 和 View 之间的通信采用的是数据绑定,ViewModel 不像 MVP 中的 presenter直接持有 View 对象,在这个模式中,ViewModel无法直接调用 View 来更新 UI 而是通过事件回调的方式来通知 View 更新,比如通过协议、通知、代理、闭包等等一些方式来异步的更新 UI。这是跟 MVP 最大的区别。这个是为了满足UI层更加细节化、可定制化。

    // Assembling of MVVM
    let model = Person(firstName: "David", lastName: "Blaine")
    //View中实现了delegate
    let view = GreetingViewController()
    let viewModel = GreetingViewModel(person: model)
    //让 ViewMode 持有此代理
    viewModel.delegate = view
    view.viewModel = viewModel
    

    以上就是我自己对三种模式的理解,希望对大家有所帮助,如有错误还请留言指出。

    参考链接:

    http://john-kong19.iteye.com/blog/934105

    http://www.jianshu.com/p/b42a26623aeb

    http://www.jianshu.com/p/75fab47aaacc

    http://www.programmer-club.com.tw/showSameTitleN/c/42739.html

    http://willtea.iteye.com/blog/1704806

    http://blog.csdn.net/txchen/article/details/1554361

    https://blog.coding.net/blog/ios-architecture-patterns

    http://blog.csdn.net/tyk0910/article/details/51120898

    http://blog.csdn.net/wqc_CSDN/article/details/53749848

  • 相关阅读:
    SAP中主数据和单据的删除
    如何在kubernetes中使用Spring Cloud微服务
    认识AngularJs
    最全面的水平居中方案跟flexbox布局
    浅谈背景图片的填充
    Html、Css、JavaScript、Dom细节总结
    innerText跟innerHtml的区别
    解决悬浮的<header>、<footer>遮挡内容的处理技巧
    怎样发布NodeJs项目
    安装grunt
  • 原文地址:https://www.cnblogs.com/houmingwei/p/8274574.html
Copyright © 2020-2023  润新知