zoukankan      html  css  js  c++  java
  • MVC、MVVM

    一.MVC

    所谓的 MVC 是指:

    • Model: 数据的拥有者,实现具体的业务逻辑。
    • View: 具体的用户界面,如按钮、列表、图片。
    • Controller: 负责将 View 中用户的动作传达给 Model,将 Model 的数据通过 View 展现出来。

    1.View 与 Controller

    View 与 Controller 的关系是十分紧密的,他们之间可以双向通信。

    Controller 可以直接操作 View。在使用 Storyboard 进行界面设计时,我们可以直接拖拽现有的控件(View),再通过 Controller—Drag 就可以为各种 控件生成一种类似于句柄的 outlet来作为 ViewController 的属性,ViewController 通过 outlet 来对 View 进行操作,设置其外观、状态或者行为等等。如果是通过纯代码来编写界面,ViewController 类中就包含了控件的实例,直接通过这些实例的指针进行操作即可。

    View 可以通过特殊的方式来发消息给 Controller。因为系统自定义的 View 并不知道当用户进行操作之后,Controller 需要做些什么,为了减少耦合性,采用了一些特殊的方式来与 Controller 进行通信。通信的方式有:

    • IBAction。通过 Controller—Drag,XCode 会自动生成事件的响应方法。也可以使用(void)addTarget:(id)target action:(SEL)action方法来注册事件的响应方法。
    • DataSource。当系统的某些 View 在呈现时需要我们提供相应的数据。我们必须为 View 指定 DataSource,并实现相应的 DataSourceProtocol(所谓的 Protocol 是指预先定义好的一组回调函数,其中的部分是必须实现的,部分是可选的。)最典型的是 UITableView,我们必须告诉系统这个 TableView 有多少行,每行的 Cell 内容是什么。
    • Delegate。它也是一组 Protocol,系统会在特定事件(如网页的跳转、网页加载)发生的前后来调用这些方法。View 可以在不知道某个类的细节的情况下,把该类设置成自己的 Delegate,只要目标类实现了 Protocol 中的必须实现的方法。这些 Protocol 中的方法的命名是有规律的,通常会包含三种关键字:
      • will: 表示这个方法会在某种事件发生前调用。
      • did: 表示这个方法会在某种事件发生后调用。
      • should: 通常用来确定该不该让某件事发生。如webView:shouldStartLoadWithRequest:navigationType:,它的返回值是布尔型,当返回 NO 时,WebView 将不会加载内容。

    2.Model 与 Controller

    Controller 直接向 Model 请求数据。一般将 Model 的类作为 Controller 的属性,直接调用相应的实例方法或者类方法即可。

    Model 通过 Notification 和 KVO 将数据的变化通知给 Controller。KVO 是指 Key-value observing,是一种观察者模式的实现,可以使得 Controller 在 Model 的数据变化时能够得到通知。Notification 是另外一种系统提供的通知机制,与 KVO 的直接通知到观察者对象不同,系统提供了一个 NotificationCenter 来广播通知。两者都可以实现一对一或一对多的关系。

    3.Model 与 View

    他们不能相互发送信息。

    二.MVVM

    既然 View 和 Controller 是一对好基友,在 MVVM 里面,干脆把它们当做 View。
    现在将原来 Controller 的部分职责拆分出来由 View Model 承担,主要包括:

    • 校验用户输入。
    • 网络请求。
    • 展示层的逻辑,比如格式化字符串。
    • 其他不能放入 Model,与 View 无关的逻辑。

    MVVM 的优点

      • MVVM 兼容 MVC,可以先创建一个简单的 View Model,再慢慢迁移。
      • 低耦合。View可以独立于Model变化和修改,一个ViewModel可以绑定到不同的View上,当View变化的时候Model可以不变,当Model变化的时候View也可以不变。
      • 可重用性。可以把一些视图的逻辑放在ViewModel里面,让很多View重用这段视图逻辑。
      • 独立开发。开发人员可以专注与业务逻辑和数据的开发(ViewModel)。设计人员可以专注于界面(View)的设计。
      • 可测试性。可以针对ViewModel来对界面(View)进行测试

     

    MVVM 最好配合 binding 机制,Model 的变化需要同步到 View Model,View Model 的变化也需要同步到 View。ReactiveCocoa 就可以用来实现 binding,当然它能做的远远不止 binding。

  • 相关阅读:
    轻、快、好、免费的开发工具
    通过改进算法来优化程序性能的真实案例(Ransac)
    图像变形算法:实现Photoshop液化工具箱中向前变形工具
    用Helper对类的行为进行修饰以便复用(附:外三篇)
    桌边书
    高音+海豚音收藏
    Silverlight Framework没有得Enum.GetValues方法
    mysql安装出现error Nr.1045
    只有mdf文件而没有ldf文件修复方法
    js鼠标样式
  • 原文地址:https://www.cnblogs.com/huangzs/p/10532691.html
Copyright © 2011-2022 走看看