Django设计模式
设计模式
设计模式是一套被反复使用的、多数人知晓的、经过分类编目的、代码设计经验的总结。用大白话说,就像造房子,不同的房间有不同的设计模式,比如客厅、卧室、厨房、厕所等等,这些房间的布局、水电管线等等都不一样。也就说开发不同的软件有不同的设计模式,这些模式是前人总结出来的
书籍:《设计模式 - 可复用的面向对象软件元素》,这本书所提出的设计模式主要是基于以下的面向对象设计原则:
- 对接口编程而不是对实现编程
- 优先使用对象组合而不是继承
设计模式六大原则
- 开闭原则(Open Close Principle)
- 里氏代换原则(Liskov Substitution Principle)
- 依赖倒转原则(Dependence Inversion Principle)
- 接口隔离原则(Interface Segregation Principle)
- 迪米特法则,又称最少知道原则(Demeter Principle)
- 合成复用原则(Composite Reuse Principle)
1、开闭原则(Open Close Principle)
开闭原则:对扩展开放,对修改关闭。即在程序需要拓展的时候,不能去修改原有的代码。为了使程序的扩展性好,易于维护和升级,我们需要使用接口和抽象类。
2、里氏代换原则(Liskov Substitution Principle)
里氏代换原则是对实现抽象化的具体步骤的规范,任何基类可以出现的地方,子类一定可以出现。只有当衍生类可以替换掉基类,软件单位的功能不受到影响时,基类才能真正被复用,而衍生类也能够在基类的基础上增加新的行为。
用大白话说,一个软件实体如果使用的是一个父类,那么使用其子类也可以,而且它察觉不出父类对象和子类对象的区别。也就是说把父类都替换成它的子类,程序的行为没有变化。
实际实现时:
- 子类必须完全实现父类的抽象方法,但不能覆盖父类的非抽象方法
- 子类可以实现自己特有的方法
- 当子类覆盖或实现父类的方法时,方法的前置条件(即方法的形参)要比父类方法的输入参数更宽松。
- 当子类的方法实现父类的抽象方法时,方法的后置条件(即方法的返回值)要比父类更严格。
- 子类的实例可以替代任何父类的实例,但反之不成立
3、依赖倒转原则(Dependence Inversion Principle)
针对接口编程,依赖于抽象而不依赖于具体。即(1)高层模块不应该依赖于低层模块,二者都应该依赖于抽象;(2)抽象不应该依赖于细节,细节应该依赖于抽象。
在Apifox里面这个相当于文档模式,即先定义和规划 API 的结构、功能和行为。
4、接口隔离原则(Interface Segregation Principle)
即使用多个隔离的接口,比使用单个接口要好(降低类之间的耦合度)。它强调降低依赖,降低耦合。用通俗点的话来说,是指客户不应该依赖它们用不到的方法,只给每个客户它所需要的接口。换句话说,就是不能强迫用户去依赖那些他们不使用的接口。
5、迪米特法则,又称最少知道原则(Demeter Principle)
一个实体应当尽量少地与其他实体之间发生相互作用,使得系统功能模块相对独立。通俗来说,只和朋友通信,不和陌生人说话。例如,军队里面有元帅、军官和士兵,元帅认识军官,军官认识自己管辖的士兵。元帅要攻击敌军,他不必直接对士兵下命令,只需要下命令给自己认识的军官,由军官将指令转发给自己所辖士兵即可。
6、合成复用原则(Composite Reuse Principle)
尽量使用合成/聚合的方式,而不是使用继承。它要求在软件复用时,要尽量先使用组合或者聚合等关联关系来实现,其次才考虑使用继承关系来实现。合成复用原则同里氏替换原则相辅相成的,两者都是开闭原则的具体实现规范。
设计模式的类型
《设计模式 - 可复用的面向对象软件元素》中所提到的,总共有 23 种设计模式。这些模式可以分为三大类:
- 创建型模式(Creational Patterns)
- 结构型模式(Structural Patterns)
- 行为型模式(Behavioral Patterns)
这里看另一种设计模式:J2EE 设计模式
Django设计模式
Django 是一个由 Python 编写的一个开放源代码的 Web 应用框架。
MVT 设计模式:模型(Model),视图(View),模板(Template)。
MVC 设计模式:模型(Model),视图(View),Controller(控制器)。
MVC模型
- 模型(M)- 编写程序应有的功能,负责业务对象与数据库的映射(ORM)
- 视图(V)- 图形界面,负责与用户的交互(页面)
- 控制器(C)- 负责转发请求,对请求进行处理
用户流程图:
MTV模型
Django 的 MTV 模式本质上和 MVC 是一样的,也是为了各组件间保持松耦合关系,只是定义上有些许不同,Django 的 MTV 分别是指:
- M 表示模型(Model):编写程序应有的功能,负责业务对象与数据库的映射(ORM)
- T 表示模板 (Template):负责如何把页面(html)展示给用户
- V 表示视图(View):负责业务逻辑,并在适当时候调用 Model和 Template
除了以上三层之外,还需要一个 URL 分发器,它的作用是将一个个 URL 的页面请求分发给不同的 View 处理,View 再调用相应的 Model 和 Template,MTV 的响应模式如下所示:
用户操作流程图:
用户通过浏览器向我们的服务器发起一个请求(request),这个请求会去访问视图函数,如果不涉及到数据调用,那么这个时候视图函数直接返回一个模板也就是一个网页给用户,如果涉及到数据调用,那么视图函数调用模型,模型去数据库查找数据,然后逐级返回,如果涉及到数据调用,那么视图函数调用模型,模型去数据库查找数据,然后逐级返回
参考:
菜鸟教程