MVC模式介绍

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应用程序,博客等。
  • 多个视图可以使用多个模型吗?
    • 可以,通常会遇到需要从多个模型整理数据并在一个视图中显示的情况。一对一的映射在现在很少见。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章