MVC模式
概念
- 模型-视图-控制器模式
- 模型:声明存储和操作数据的类
- 视图:声明构建用户界面和显示数据的类
- 控制器:连接模型和视图的类
- 客户端:根据某些操作来获得某些结果
各层的定义
- 模型层定义针对数据的所有操作,并且提供与数据使用方式有关的方法。比如数据库连接等。
- 视图层代表用户界面,比如GUI,web的前端等,他没有逻辑处理,只用来显示数据。
- 控制层用来请求接收视图层的数据,然后发送到系统其它部分。一般在这配置路由系统。
应用场景
- 更改展示方式而不更改业务逻辑
- 多个控制器用于多个视图来更改用户界面的显示数据
- 模型改变,视图不用改变,他们相互独立
主要目的
- 数据和数据的展示隔离
- 维护和实现更加简单
- 灵活的改变数据的存储和显示方式,让他们独立。
例子:
# 模型-视图-控制器模式
class Model:
services = {
'email':
{
'number': 1000,
'price': 2,
},
'sms':
{
'number': 1000,
'price': 10,
},
'voice':
{
'number': 1000,
'price': 15,
}
}
class View:
def list_services(self, services):
for svc in services:
print(svc, ' ')
def list_pricing(self, services):
for svc in services:
print(Model.services[svc]['number'],
'条',
svc,
'消息你应该支付',
Model.services[svc]['price'],
'元')
class Controller:
def __init__(self):
self.model = Model()
self.view = View()
def get_services(self):
services = self.model.services.keys()
return self.view.list_services(services)
def get_pricing(self):
services = self.model.services.keys()
return self.view.list_pricing(services)
def Client():
controller = Controller()
print('我们提供:')
controller.get_services()
print('他们的价格是:')
controller.get_pricing()
Client()
还有很经典的web框架都是mvc或者mtv模式
比如Django也是以模型-视图-控制器来构造项目的,只是形式为模型-模板-视图(Model-Template-View,MTV),其中M是数据库,T是视图,V是视图和路由。Tornado是一个标准的MVC框架,可以再去查看。
MVC模式的优点
- 可以把3层分开,调高可维护性,降低复杂度
- MVC允许对前端进行独立更改,而后端不需要改动或者很少改动。
- 同样可以更改后端而不改前端
- 更改控制器也不会对其他造成影响
- MVC可以把职位分开(前端,后端,UI),可以在擅长的领域工作。
一些问题
- MVC是不是一种模式,为什么是复合模式?
- 本质上来说,复合模式就是解决大型设计问题的一组模式。所以他也是模式。
- MVC只能用于网站吗?
- 不,网站是最好的例子,但也可以用在很多领域,比如GUI应用程序,博客等。
- 多个视图可以使用多个模型吗?
- 可以,通常会遇到需要从多个模型整理数据并在一个视图中显示的情况。一对一的映射在现在很少见。