Python设计模式 - 总览(更新中...)
最近打算重构部分python项目,有道是"工欲善其事,必先利其器",所以有必要梳理一下相关设计模式。每次回顾基本概念或底层实现时都会有一些新的收获,希望这次也不例外。
本系列打算先简略介绍面向对象语言的通用特性作为铺垫,这也是设计模式的基础,然后详细介绍python相关的设计模式,辅以简单、易懂、常用的实例,最后略作总结。因为后续会分篇具体介绍各个设计模式的python实现,所以相应的链接会持续更新。
设计模式的优点
为啥一定要使用设计模式呢?给个理由先:
- 复用成熟的解决方案:设计模式本身就是前人成功经验的提炼和总结,我们可以从中获益、少踩坑
- 便于开发过程中的通用术语交流: 设计模式在项目分析和设计阶段提供了共通的交流基准
- 类或对象之间的松耦合:松耦合带来的明显好处是易维护
- 面向接口编程:此特性的优点在于易扩展,灵活性好
- 深入理解面向对象体系:通过对设计模式的细节挖掘,可以更透彻地理解面向对象体系的设计原理及具体实现
面向对象综述
面向对象通过类来实现对万事万物的抽象,包含三个重要特性:封装,继承和多态。这正是这三个特性衍生出多种多样的设计模式及类与类之间的关系。
- 封装:将类的某些信息隐藏在类的内部,限制外部使用者的直接访问,只允许通过类提供的方法实现对隐藏信息的访问和操作,隔离变化
- 继承:对多个类型进行共性抽取形成父类,被共性抽取的多个类就是该父类的子类,共性抽取、父类和子类就是继承的要素
- 多态:一个事物具有的多种形态。实现多态的方式有两种:覆写 & 重载
在如上三种特性基础上可以扩展出类与类之间六种不同的关系,总览中只简述,详情参考链接。
- 依赖关系(Dependency): 在局部变量,方法的形参,或者对静态方法的调用中实现
- 关联关系(Association): 在类的成员变量中实现,可以双向也可以单向
- 聚合关系(Aggregation): 强关联,整体与部分的关系,但是可分离、生命周期相互独立
- 组合关系(Composition): 更强关联,整体与部分的关系,不可分离、生死与共
- 继承关系(Generalization):类与类,或接口与接口之间的父子关系
- 实现关系(Implementation): 接口或抽象类定义好的操作集合,由实现类完成接口或抽象类的具体操作
Python对象特性
Python与设计模式相关的对象特性跟Java略有不同,python本身是动态语言,无interface且支持多重继承;而Java是静态强类型语言,有interface且只支持单继承。
- 动态语言: 运行中可以动态地改变类的内部结构,如鸭子类型的应用
- 弱类型语言(?): 这一点多少还是有争议的。从“变量类型由其值的类型决定”角度来说,python是弱类型语言;从“类型安全”的角度来说,python是强类型语言
- 无Interface: python中没有类似java中的interface,所以需要面向接口编程时更多采用抽象类
- 多重继承: python允许子类有多个父类,使用多重继承时需注意继承顺序,建议谨慎使用。
设计模式七大原则
如何设计出简洁、易懂、灵活、优美的代码结构的确是一门学问,透彻理解并践行如下七大原则通常都能取得基本满意的结果。总览中只简述,详情参考链接。
- 单一职责原则(Single Responsibility Principle):一个类负责一项职责,单纯的快乐
- 开放关闭原则(Open-Closed Principle):对扩展开放,对修改关闭
- 里氏替换原则(Liskov Substitution Principle):继承与派生的规则,子类可替换父类
- 依赖倒转原则(Dependence Inversion Principle):高层模块不应该依赖于底层模块,二者都应该依赖于抽象
- 接口隔离原则(Interface Segregation Principle):建立单一接口,尽量细化接口,接口中的方法越少越好
- 迪米特法则(Law Of Demeter):高内聚,低耦合
- 组合/聚合复用原则 (Composition/Aggregation Reuse Principle):尽量使用组合/聚合,最好不要使用继承,尤其是多重继承
Python设计模式的分类
上面说了那么多只是引子,方便我们理解设计模式的基础概念和基本原则,接下来介绍python设计模式的分类及实现。当然此处仅为模式列表,详情点击相关链接。
- 前导
- Python设计模式 - 基础 - 封装 & 继承 & 多态
- Python设计模式 - 基础 - 类与类之间的六种关系
- UML
- Python设计模式 - UML - 类图(Class Diagram)
- Python设计模式 - UML - 对象图(Object Diagram)
- Python设计模式 - UML - 包图(Package Diagram)
- Python设计模式 - UML - 用例图(Use Case Diagram)
- Python设计模式 - UML - 状态图(State Machine Diagram)
- Python设计模式 - UML - 时序图(Sequence Diagram)
- Python设计模式 - UML - 组件图(Component Diagram)
- Python设计模式 - UML - 部署图(Deployment Diagram)
- Python设计模式 - UML - 活动图(Activity Diagram)
- Python设计模式 - UML - 通信图(Communication Diagram)
- Python设计模式 - UML - 组合结构图(Composite Structure Diagram)
- Python设计模式 - UML - 交互概述图(Interaction Overview Diagram)
- Python设计模式 - UML - 定时图(Timing Diagram)
- 分类
- Python设计模式 - 创建型 - 单例模式(Singleton) - 十种
- Python设计模式 - 创建型 - 简单工厂(Factory)
- Python设计模式 - 创建型 - 工厂方法(Factory Method)
- Python设计模式 - 创建型 - 抽象工厂(Abstract Factory)
- Python设计模式 - 创建型 - 建造者(Builder)
- Python设计模式 - 创建型 - 原型(Prototype)
- Python设计模式 - 结构型 - 适配器(Adapter)
- Python设计模式 - 结构型 - 桥接(Bridge)
- Python设计模式 - 结构型 - 装饰(Decorator)
- Python设计模式 - 结构型 - 组合(Composite)
- Python设计模式 - 结构型 - 外观(Facade)
- Python设计模式 - 结构型 - 享元(Flyweight)
- Python设计模式 - 结构型 - 代理(Proxy)
- Python设计模式 - 行为型 - 模板方法(Template Method)
- Python设计模式 - 行为型 - 观察者(Observer)
- Python设计模式 - 行为型 - 状态(State)
- Python设计模式 - 行为型 - 策略(Strategy)
- Python设计模式 - 行为型 - 责任链(Chain of Responsibility)
- Python设计模式 - 行为型 - 命令(Command)
- Python设计模式 - 行为型 - 访问者(Visitor)
- Python设计模式 - 行为型 - 中介者(Mediator)
- Python设计模式 - 行为型 - 备忘录(Memento)
- Python设计模式 - 行为型 - 迭代器(Iterator)
- Python设计模式 - 行为型 - 解释器(Interpreter)
- Python设计模式 - 其他 - 空对象(Null Object)
- Python设计模式 - 其他 - 对象池(Object Pool)
- Python设计模式 - 其他 - 图搜索(Gragh Search)
- Python设计模式 - 其他 - 不可变(Immutable)
- Python设计模式 - 其他 - 黑板(Blackboard)
- Python设计模式 - 其他 - 雇工(Servant)
- Python设计模式 - 其他 - 过滤器(Filter)
- Python设计模式 - 其他 - 共享(Borg)
- Python设计模式 - 总结
- 内置
Python设计模式 - 总览(更新中...)的更多相关文章
- Python奇技淫巧 - 持续更新中....
Python奇技淫巧 人生苦短,我用Python: 编程界这绝对不是一句空话,尤其是对于使用过多个语言进行工作的同学们来说,用Python的时间越长,越有一种我早干嘛去了的想法,没事,啥时候用Pyth ...
- MVC设计模式(持续更新中)
MVC设计模式--->英文全称为: model(模型) View (视图) Controller(控制) MVC是一种设计思想.这种思想强调实现模型(Model).视图(View)和控制 ...
- python总结(更新中)
1 python函数中的参数传递(注意可变和不可变传递) 可更改(mutable)与不可更改(immutable)对象 在 python 中,strings, tuples, 和 numbers 是不 ...
- 浅谈Python设计模式 -- 责任链模式
声明:本系列文章主要参考<精通Python设计模式>一书,并且参考一些资料,结合自己的一些看法来总结而来. 之前在最开始就聊了Python设计模式有三种,其中关于创建型和结构型设计模式基本 ...
- 2020企业python真面试题持续更新中
目录 1.软件的生命周期 2.如何知道一个python对象的类型 3.简述Django的设计模式MVC,以及你对各层的理解和用途 4.什么是lambda函数,说明其使用场景 5.python是否支持函 ...
- Python之路【第二十篇】:待更新中.....
Python之路[第二十篇]:待更新中.....
- Python开发【第二十三篇】:持续更新中...
Python开发[第二十三篇]:持续更新中...
- Python之路,Day25-----暂无正在更新中
Python之路,Day25-----暂无正在更新中
- Python之路,Day26-----暂无正在更新中
Python之路,Day26-----暂无正在更新中
随机推荐
- 使用MagicAJax的AjaxPanel时有时会弹出"Using the AjaxCallHelper write methods outside of an AjaxCall is not allowed."
------解决方案--------------------------------------------------------1.看下你的输出是不是包含在<ajax:AjaxPanel I ...
- [Python]查询mysql导出结果至Excel并发送邮件
环境:Linux +python2.7+mysql5.6 1.提前安装xlwt(excel写入操作模块),MySQLdb(mysql操作模块) 2.脚本如下: #!/usr/bin/python #c ...
- Oracle修改表或者字段的注释
转自:https://www.cnblogs.com/fx-blog/p/7132833.html 语句:comment on table 表名 is '表的注释信息'; comment on col ...
- Set原理
一.HashSet判断重读值的原理 1. 哈希表的存储结构: ==>数组+链表,数组的每个元素以链表的形式存储 2.如何把对象存储到哈希表中 ==>先计算对象的hashcod值,再对数组的 ...
- 机器学习进阶-图像梯度计算-scharr算子与laplacian算子(拉普拉斯) 1.cv2.Scharr(使用scharr算子进行计算) 2.cv2.laplician(使用拉普拉斯算子进行计算)
1. cv2.Scharr(src,ddepth, dx, dy), 使用Scharr算子进行计算 参数说明:src表示输入的图片,ddepth表示图片的深度,通常使用-1, 这里使用cv2.CV_6 ...
- Linux Centos6.5 SVN服务器搭建 以及客户端安装
转载:http://www.cnblogs.com/mymelon/p/5483215.html /******开始*********/ 系统环境:Centos 6.5 第一步:通过yum命令安装sv ...
- 函数参数,const 引用 和 非 const引用是不同的函数。
举个例子, void f(const int &x) 和 void f(int &x) 是不同的函数. 函数的返回值不能作为区分
- centos7,进程最大打开文件数 too many open files错误
遇到一问题,tomcat最近发生几次异常,查看日志,发现一直报 too many open files,熟悉的同学都知道这是用户打开文件数过多导致的, 再用命令ls /proc/20861/fd/ | ...
- Dos命令快速设置ip、网关、dns地址
netsh interface ip set address name="本地连接" source=static 192.168.1.8 255.255.255.0 192.168 ...
- oracle第四天笔记
游标 /* 序列: ORACLE使用来模拟ID自动增长的 */ create sequence seq_test4; create table test2( tid number primary ke ...