python 设计模式(十四) 模型-视图-控制器模式(Model-View-Controller pattern)

本节选自《精通Python设计模式》【荷】Sakis Kasampalis

    关注点分离(Separation of Concerns, SoC)原则是软件工程相关的设计原则之一,SoC原则背后的思想是将一个应用切分为不同的部分,每个部分解决一个单独的关注点。分层设计中的层次(数据访问层,业务逻辑层和表示层等)即是关注点的例子。使用SoC原则能简化软件应用的开发和维护

    模型-视图-控制器(Model-view-Controller,MVC)模式是应用到面向对象编程的Soc原则。模式的名称来源于用来切分软件的三个主要部分。即模型部分,视图部分和控制器部分。MVC模式被认为是一种架构模式而不是一种设计模式。

    模型部分是核心部分,代表着应用的信息本源,包含和管理业务逻辑、数据、状态以及应用的规则。视图是模型的可视化表现。视图的例子有,计算机图形用户界面、计算机终端的文本输出、智能手机的应用图形界面、Pdf文档等。视图只是展示数据,并不处理数据。控制器控制模型和视图之间的连接。模型和视图的所有通信都通过控制器进行:

大致过程如下

1 用户通过单击某个按钮触发一个视图

2 视图把用户操作告知控制器

3 控制器处理用户输入,并与模型交互

4 模型执行所有必要的校验和状态改变,并通知控制器该做什么

5 控制器按照模型给出的指示,指导视图适当地进行更新和显示

Django是一个MVC框架,但它使用了不同命名方式。Django中控制器被称为视图。视图被称为模板。模型的称呼没变。因此Django中的框架变为模型-模板-视图框架。Django的设计者称:视图是描述哪些数据对用户可见。因此,Django把它对应的一个特定url的python回调函数称为视图。Django中的模板用于把内容和展示分离,其描述的是用户看到的数据的方式,而不是哪些数据可见。

MVC框架的好处:

1 视图(后台)和美工(UI,前端)的分离允许美工、前端一心搞UI、页面,后台程序员一心搞开发,不会相互干扰

2 由于视图和模型之间的松耦合,每个部分可以单独修改、扩展。不会相互影响。例如,添加一个新视图的成本很小,只要为它实现一个控制器即可。

3 因为职责明晰,维护起来很简单

设计原则:模型很智能,控制器很瘦,视图很傻瓜(真心不太明白)

以下代码实现了一个简单的例子。

View类视图类。实现了show,add,remove方法。Model类模型类,是一个字典。保存了一些键值对。Controller类控制器类。控制视图与模板的交互。控制器实现了add, remove方法,其是对model中方法的封装。


class View(object):

    def __init__(self, controller):
        self.controller = controller

    def show(self):
        self.controller.show()

    def add(self, key, value):

        self.controller.add(key, value)

    def remove(self, key):
        self.controller.remove(key)


class Controller(object):
    def __init__(self, model):
        self.model = model

    def show(self):
        for key, item in self.model.items():
            print(key, item)

    def add(self, key, value):
        self.model[key] = value

    def remove(self,key):
        if key in self.model.keys():
            self.model.pop(key)


class Model(dict):
    pass


if __name__ == '__main__':
    model = Model([(0,'xiaoming'),(1,'xiaohua'),(2, 'xiaogang'),(3,'xiaohua'),(4,'xiaoli')])
    controller = Controller(model)
    view = View(controller)
    view.show()
    print('*'*100)
    view.add(5,'laoliu')
    view.show()
    print('*'*100)
    view.remove(0)
    view.show()
0 xiaoming
1 xiaohua
2 xiaogang
3 xiaohua
4 xiaoli
****************************************************************************************************
0 xiaoming
1 xiaohua
2 xiaogang
3 xiaohua
4 xiaoli
5 laoliu
****************************************************************************************************
1 xiaohua
2 xiaogang
3 xiaohua
4 xiaoli
5 laoliu

 

    原文作者:ruguowoshiyu
    原文地址: https://blog.csdn.net/ruguowoshiyu/article/details/81091584
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞