假设我要输出消息“hi”。该字符串在控制器类中创建,然后传递给模型类中的处理程序,然后传递给视图类中的输出函数。
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)
“控制器”从不接触视图,但是将字符串传递给类似的类似乎对我有点不安,因为它几乎就像我最初只能键入print('hi')
一样,这显然很明显违反了MVC原则。
答案 0 :(得分:1)
简短地说:
关于您的代码,这是错误的,模型应该知道关于视图的 NOTHING 。
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)
在第二个中,当您可以订阅视图以观察模型中的更改时,可以使用Observer Pattern。进行更改后,模型会通知其观察者,然后他们可以采取行动。
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)
P.S。:我不习惯在python中编程,也许有一些合成错误。
答案 1 :(得分:-2)
将字符串传递给模型肯定是可以的; MVC是一种分层架构。在分层体系结构中,您可以从应用程序层(控制器)自由地“移动”到下面的域层(模型)。请注意,我将变量描述为“移动”。
所以: 您可以使用变量从控制器调用模型中的函数。 班级管制员 { void方法() { Model.call( 'yourstring'); } }
但是,您不应该从模型向上移动到控制器。
你的模型会对这个字符串做一些事情(可能会更新自己),并且在好的MVC中,更改将触发视图上的事件。