0

Let's say I want to output a message "hi". The string is created in the controller class, then passed to a handler in the model class, and then to an output function in the view class.

e.g.

class Controller:
  def __init__(self):
    self.model = Model()
  def myMessage(self):
    self.model.messageHandler('hi')

class Model:
  def __init__(self):
    self.view = View()
  def messageHandler(self, msg):
    self.view.display_my_message(msg)

class View:
  def display_my_message(self, message)
    print(message)

The "controller" never touches the view, but passing the string down the classes like that seems to be a bit disconcerting to me, since it's almost like I could've just typed print('hi') initially, which would obviously violated MVC principles.

4

2 回答 2

1

简而言之:

  • 控制器:处理用户请求,例如单击按钮(用于桌面应用程序)或发送表单(用于 Web)
  • 模型:处理数据,如何表示、存储和检索数据。
  • 视图:处理视觉部分,即用户真正看到的内容。

关于您的代码,这是错误的,模型应该对视图一无所知

MVC 有两种主要方法:被动模型和主动模型。

在第一个中,控制器是模型数据与其在视图中的表示之间的中介。

class Controller:
  def __init__(self):
    self.model = Model()
    self.view = View()
  def messageHandler(self):
    self.view.display_my_message(self.model.getMessage())

class Model:
  def __init__(self):
      pass
  def getMessage(self):
      return 'hi'

class View:
  def display_my_message(self, message)
    print(message)

在第二个中,您使用观察者模式,当您可以订阅视图以观察模型中的变化时。当进行更改时,模型会通知其观察者,然后他们可以采取行动。

class Controller:
  def __init__(self):
    self.model = Model()
  def messageHandler(self):
    self.model.putMessage('hi')

class Model:
  def __init__(self):
      self.subscribers = []
      self.message = ''

  def attach(subscriber):
      self.subscribers.append(subscriber)

  def notify():
      for s in self.subscribers:
          s.update()

  def putMessage(self, message):
      self.message = message
      self.notify()

  def getMessage(self):
      return self.message

class View:
  def update(self, message)
    print(message)

PS:我不习惯用python编程,可能有一些语法错误。

于 2013-09-06T19:22:17.307 回答
-2

给Model传一个字符串肯定没问题;MVC 是一种分层架构。在分层架构中,您可以自由地从应用层(控制器)“移动”到下面的领域层(模型)。请注意,我将变量的传递描述为“移动”。

所以:您可以使用变量从控制器调用模型中的函数。类控制器 { void method() { Model.call('yourstring'); } }

但是,您不应该从模型向上移动到控制器。

您的模型将使用此字符串执行某些操作(可能会自行更新),并且在良好的 MVC 中,更改将触发视图上的事件。

于 2013-09-07T13:40:08.943 回答