Dav*_*Liu 7 model-view-controller design-patterns backend
前端的 MVC 非常有意义。但是为什么我们在后端也需要 MVC 呢?在这种情况下,“视图”在哪里,因为后端不提供任何视觉效果。
MVC 旨在分离接受用户输入、执行业务逻辑和呈现输出的应用程序中的关注点。它没有说明该逻辑位于何处。它也没有指定所有逻辑必须存在于单个进程中。
MVC 的一个相当传统的用途是电子表格。让我们看看单进程应用程序和多进程应用程序,看看它们如何实现这个简单的电子表格:
A B C
----- ----- ---------
1 | 1 2 =A1+B1
Run Code Online (Sandbox Code Playgroud)
假设用户将数字输入4到 cell 中A1。会发生什么?
单进程应用程序(例如 Microsoft Excel):用户输入由视图逻辑处理,直到用户离开单元格。一旦发生这种情况,控制器就会收到一条消息,用新值更新模型。该模型接受新值,但也运行一些业务逻辑来更新受更改影响的其他单元格的值。完成后,模型会通知视图其状态已更改,并且视图呈现新状态。正如 @jaco0646 所建议的那样,该通知可以通过 pub/sub 发生,但也可以通过回调来处理。
多进程应用程序(例如Google Sheets):用户输入由视图逻辑(在客户端中)处理,直到用户离开单元格。一旦发生这种情况,控制器(在服务器上)就会收到一条消息(通过 HTTP 或套接字),以使用新值更新模型(也在服务器上)。该模型接受新值,但也运行一些业务逻辑来更新受更改影响的其他单元格的值。完成后,模型通知视图其状态已更改,并且视图呈现新状态(在客户端中)。该通知可以通过控制器的 HTTP 响应或通过套接字发出。
也就是说,MVC模式对于这两种场景都适用。
此外,将客户端和服务器视为两个完全独立的应用程序也是完全有效的,它们都可以实现 MVC。在这种情况下,客户端的模型和服务器的视图都不太传统。客户端的模型可能会向服务器发出 AJAX 请求,而不是本身运行复杂的业务逻辑或在本地保存数据。而且,服务器的视图很可能是一个序列化程序,它生成客户端可以理解的某种形式的结构化输出,例如 JSON、XML,甚至 CSV。
只要应用程序需要接受用户输入、执行某些业务逻辑并呈现某些输出,MVC 就是一种完全有效的模式,无论该应用程序是运行在一个还是多个进程上,也无论视图是否是人类所愿意的消耗。