关注点分离(SoC separation of concerns)师软件工程相关的设计原则之一。SoC原则背后的想法是将应用程序分成不同的部分,每个部分解决一个单独的问题。这种关注点的例子是分层设计中使用的层(数据访问层、业务逻辑层、表现层等等)。使用SoC原则可以简化软件应用程序的开发和维护。
MVC模式只不过是将SoC原则应用于OOP。该模式的名称来自于用于分割软件应用的三个主要组件:模型、视图和控制器。MVC被认为是一种架构模式,而不是一种设计模式。架构模式和设计模式的区别在于,前者比后者的范围更广。然而,MVC太重要了,不能因为这个原因就跳过。即使我们永远不需要从头开始实现它,我们也需要熟悉它,因为所有常见的框架都使用MVC或其变种。
模型是核心组件。它代表知识。它包含并管理应用程序的(业务)逻辑、数据、状态和规则。视图是模型的可视化表示。视图的例子有计算机GUI、计算机终端的文本输出、智能手机的应用GUI、PDF文档、饼状图、柱状图等等。视图只显示数据,它并不处理数据。控制器是模型和视图之间的纽带/粘合剂。模型和视图之间的所有通信都通过控制器进行。
典型的使用MVC的应用程序,在初始屏幕呈现给用户后,其使用情况如下。
你可能想知道,为什么控制器部分是必要的?我们就不能跳过它吗?可以,但这样我们就会失去很大的好处:可以在不修改模型的情况下使用多个视图(甚至同时使用,如果我们想这样的话)。为了实现模型和其表现形式之间的解耦,每个视图通常都需要自己的控制器。如果模型直接与特定的视图通信,我们就不能使用多个视图(或者至少,不能以干净和模块化的方式)。
MVC是应用于OOP的SoC原则。SoC原则在现实生活中被大量使用。例如,如果你建造一栋新房子,你通常会指派不同的专业人员去做。1)安装水管和电;以及,2)喷漆。
在餐馆里,服务员接受订单并为顾客提供菜肴,但饭菜是由厨师烹制的。
在Web开发中,有几个框架采用了MVC的思想。
MVC是一个非常通用和有用的设计模式。事实上,所有流行的Web框架(Django、Rails和Symfony或Yii)和应用程序框架(iPhone SDK、Android和QT)都使用了MVC或其变体--模型-视图-适配器(MVA)、模型-视图-呈现器(MVP),等等。然而,即使我们不使用这些框架,在我们自己身上实现该模式也是有意义的,因为它提供了以下好处。
当从头开始实现MVC时,要确保你创建了智能模型、瘦控制器和傻瓜视图。
模型被认为是智能的,因为:
控制器被认为是瘦的,因为。
视图被认为是傻瓜的,因为:
如果你正在从头开始实施MVC,并想知道你是否做对了,你可以试着回答一些关键问题。
如果你确保这些条件得到满足,与不使用MVC的应用程序相比,你的应用程序将更加灵活和可维护。
我们用非常简单的例子向你展示如何从头开始实现MVC:报价打印机。用户输入一个数字,看到与该数字相关的报价。报价被存储在元组中,实际应用多存在数据库、文件等,只有模型可以直接访问它。
quotes = (
'A man is not complete until he is married. Then he is finished.',
'As I said before, I never repeat myself.',
'Behind a successful man is an exhausted woman.',
'Black holes really suck...',
'Facts are stubborn things.'
)
class QuoteModel:
def get_quote(self, n):
try:
value = quotes[n]
except IndexError as err:
value = 'Not found!'
return value
class QuoteTerminalView:
def show(self, quote):
print(f'And the quote is: "{quote}"')
def error(self, msg):
print(f'Error: {msg}')
def select_quote(self):
return input('Which quote number would you like to see? ')
class QuoteTerminalController:
def __init__(self):
self.model = QuoteModel()
self.view = QuoteTerminalView()
def run(self):
valid_input = False
while not valid_input:
try:
n = self.view.select_quote()
n = int(n)
valid_input = True
except ValueError as err:
self.view.error(f"Incorrect index '{n}'")
quote = self.model.get_quote(n)
self.view.show(quote)
def main():
controller = QuoteTerminalController()
while True:
controller.run()
if __name__ == '__main__':
main()
这个模型只有一个 get_quote() 方法,根据它的索引 n 返回 quotes 元组的报价 (字符串)。
视图有三个方法:show(),用来在屏幕上打印一个引用(或消息Not found!),error(),用来在屏幕上打印一个错误信息,select_quote(),读取用户的选择。这可以从下面的代码中看出。
控制器做协调工作。init()方法初始化模型和视图。run()方法验证用户给出的报价指数,从模型中获得报价,并将其传回给视图显示,如下代码所示。
最后但同样重要的是,main()函数初始化并启动控制器。
页面更新:2024-04-25
本站资料均由网友自行发布提供,仅用于学习交流。如有版权问题,请与我联系,QQ:4156828
© CopyRight 2020-2024 All Rights Reserved. Powered By 71396.com 闽ICP备11008920号-4
闽公网安备35020302034903号