我对模特的确切内容感到有些困惑。我知道它适用于来自数据库等的数据。它可以用于其他任何东西吗?例如,一个身份验证系统,在用户注册时向用户发送激活电子邮件。哪个是最适合放置电子邮件代码的地方?模型是否合适......或者更好地放在视图,控制器等中?
答案 0 :(得分:18)
这样想。您正在设计应用程序,并且根据路线图您知道版本1除了基于文本的命令行界面之外什么也没有。版本2将具有基于Web的界面,版本3将使用某种gui api,例如windows api或cocoa,或某种跨平台工具包。没关系。
该程序可能也必须进入不同的平台,因此他们将需要使用不同的电子邮件子系统。
该模型是不会在这些不同版本中进行更改的程序部分。它构成了逻辑核心,可以完成程序所做的任何特殊事情的实际工作。
您可以将控制器视为消息转换器。它有两面接口,一面朝向模型,一面朝向视图。当您创建不同的版本时,主要活动将重写视图,并更改控制器的一侧以与视图交互。
您也可以将其他平台/版本特定内容放入控制器中。
在本质上,控制器的工作是帮助您将模型中的域逻辑与您转储到视图中的任何特定于平台的垃圾或其他模块分离。
因此,为了弄清楚模型中是否存在某些内容,请问自己“如果我必须重写此应用程序以在平台X上工作,我是否必须重写该部分?”如果答案是肯定的,请将其保留在模型之外。如果答案是否定的,那么它可能会进入模型,如果它是程序基本逻辑的一部分。
这个答案可能不是正统的,但这是我发现MVC范式的唯一方式,这种范式并没有让我的大脑从无意义的理论上对我的耳朵融化,因为关于MVC的讨论是如此满满的。
答案 1 :(得分:15)
答案 2 :(得分:8)
该模型是您表示应用程序数据的方式。它是应用程序的状态,数据会影响应用程序的输出(编辑:可视化表示),以及可以由控制器调整的变量。
专门回答您的问题
电子邮件的内容,发送电子邮件的人是模特。
发送电子邮件(并首先验证电子邮件/注册)并确定电子邮件内容的代码位于控制器中。控制器还可以生成电子邮件的内容 - 也许您在模型中有一个电子邮件模板,控制器可以用其处理中的正确值替换占位符。
视图基本上是“身份验证电子邮件已发送到您的帐户”或“您的电子邮件地址无效”。因此控制器会查看模型并确定视图的输出。
答案 3 :(得分:1)
想象这个
模型是应用程序运行的数据的特定于域的表示。
Controller处理并响应事件(通常是用户操作),并可以调用模型上的更改。
所以,我想说你想把电子邮件的代码放在控制器中。
答案 4 :(得分:0)
MVC通常用于UI设计。我认为,在你的情况下,一个简单的观察者模式将是理想的。您的模型可以通知向其注册用户已注册的侦听器。然后,该听众将发送电子邮件。
答案 5 :(得分:0)
该模型是数据存储后端的表示。这可以是数据库,文件系统,Web服务,...... 通常,模型会将数据库的关系结构转换为应用程序的面向对象结构。
在上面的示例中:您将拥有一个具有注册操作的控制器。该模型保存用户在注册过程中输入的信息,并注意数据在数据后端中的正确保存。
控制器成功保存操作后,应发送激活电子邮件。
伪代码:
public class RegisterModel {
private String username;
private String email;
// ...
}
public class RegisterAction extends ApplicationController {
public void register(UserData data) {
// fill the model
RegisterModel model = new RegisterModel();
model.setUsername(data.getUsername());
// fill properties ...
// save the model - a DAO approach would be better
boolean result = model.save();
if(result)
sendActivationEmail(data);
}
}
可以找到更多关于MVC概念的信息here:
答案 6 :(得分:0)
应该注意的是,MVC不是一种适合每种类应用的设计模式。在您的情况下,发送电子邮件是一种在MVC模式中没有完美位置的操作。如果您正在使用强制您使用MVC的框架,请将其放入控制器,就像其他人所说的那样。