Model view controller 经典与扩展MVC 在经典MVC中:

Model view controller 经典与扩展MVC 在经典MVC中:,model-view-controller,Model View Controller,设置机制如下所示: 实例化模型 实例化视图(具有对控制器的引用,最初为空) 实例化控制器并引用两者(控制器向视图注册,因此视图现在有一个对控制器的(非空)引用) 问题是为什么在第二步中视图应该引用控制器(我认为控制器引用视图就足够了) 在扩展MVC中: 设置机制如下所示: 实例化模型(具有对视图的引用,初始为空) 参照模型实例化视图(视图向模型注册) 实例化控制器并引用两者(控制器寄存器与视图) 问题是为什么在第一步中,模型应该有一个对视图的引用(我知道的是,模型不应该知道关于视图的任何信

设置机制如下所示:

  • 实例化模型
  • 实例化视图(具有对控制器的引用,最初为空)
  • 实例化控制器并引用两者(控制器向视图注册,因此视图现在有一个对控制器的(非空)引用)
  • 问题是为什么在第二步中视图应该引用控制器(我认为控制器引用视图就足够了)

    • 在扩展MVC中:

    设置机制如下所示:

  • 实例化模型(具有对视图的引用,初始为空)
  • 参照模型实例化视图(视图向模型注册)
  • 实例化控制器并引用两者(控制器寄存器与视图)
  • 问题是为什么在第一步中,模型应该有一个对视图的引用(我知道的是,模型不应该知道关于视图的任何信息,在这种情况下应该使用模式观察者)


    谢谢你的帮助。

    两个问题的答案都是一样的。您的图表非常抽象,您完全正确,在这两种情况下都不应直接引用。您可以通过定义良好的接口(duck类型)进行引用,也可以通过订阅发生在可观察对象上的事件进行引用

    看看您的观察者示例。根据它的说法,被观察者对其观察者所知道的唯一一件事就是他们对
    notify
    方法做出响应。所以从技术上讲,两者之间实际上存在一个循环引用,但如果是从可观察对象(模型)到观察者(视图)的引用,则是第一周

    第一种情况也是如此。视图不直接知道控制器。但控制器必须收到UI事件的通知(例如,单击按钮)并作出响应。这通常是通过让控制器注册视图中发生的事件来完成的。但从技术上讲,该视图将保留事件响应者的列表。所以实际上有一个参考,但又是一个弱的参考。它不会阻止您将同一视图与另一个控制器重复使用


    所以,您的担心是对的,循环依赖是一种气味。但是,在低技术级别上,它们是必需的,为了实现失去耦合,您只需使它们的一侧变弱,这将使依赖项可交换

    ,因此理论上禁止循环引用,但技术问题会迫使它们存在于代码内部。它们是不被禁止的。这只是你的程序如何看待它们。一个可观察对象将始终保持其观察者的数组。从技术上讲,这是一个参考。但它严格遵循具有notify方法的接口。它可以是任何有notify方法的东西。在一些语言中,比如Java,甚至有一个严格的接口概念。Observer类必须声明它正在实现Observer接口,否则它将无法注册,这不是“经典MVC”。@tereško我在与问题描述链接的文档中找到了名称。请给出正确的名称好吗?关于“经典mvc”,请参见。我不知道什么是“扩展mvc”,但有一种东西通常被称为“web mvc”,或者,它基本上是经典的,但没有观察者和持久模型的要求(更适合网站的请求-响应性质)。。。。哦,还有RubyonRails,它使用“mvc”作为营销术语,但与之毫无共同之处。感谢您的帮助:)