实战Python设计模式:可复用面向对象软件开发实践
  • 推荐0
  • 收藏3
  • 浏览2.7K

实战Python设计模式:可复用面向对象软件开发实践

薛卫国 , 薛卫民 (作者)  林瑞和 (责任编辑)

  • 书  号:978-7-121-37959-8
  • 出版日期:2020-03-01
  • 页  数:236
  • 开  本:16(170*240)
  • 出版状态:上市销售
  • 维护人:林瑞和
作为可复用面向对象软件开发的基础,设计模式集合了很多软件开发领域专家的宝贵经验和良好实践,其重要性不言而喻。但是,学习设计模式的过程并不是一帆风顺的,对于缺乏面向对象开发经验的设计者尤其如此。
就像在游泳池中不能学会海战一样,我们不应该指望理解几个似是而非的例子就可以在实际开发中灵活运用设计模式。学习设计模式最好的方式就是在实际的开发中边学边练边体会。本书利用Python 的标准GUI 工具包tkinter,通过可执行的示例对23 个设计模式逐个进行说明。这样一方面可以使读者了解真实的软件开发工作中每个设计模式的运用场景和想要解决的问题;另一方面通过对这些问题的解决过程进行说明,让读者明白在编写代码时如何判断使用设计模式的利弊,并合理运用设计模式。
对设计模式感兴趣而且希望随学随用的读者通过本书可以快速跨越从理解到运用的门槛;希望学习Python GUI 编程的读者可以将本书中的示例作为设计和开发的参考;使用Python 语言进行图像分析、数据处理工作的读者可以直接以本书中的示例为基础,迅速构建自己的系统架构。
掌握设计模式,攀登编程巅峰。Python高阶学习,就从Python设计模式开始。
薛卫国
大连某日资嵌入式软件开发公司架构组负责人、CSDN博客专家,埋头于C++开发第一线二十余年,擅长面向对象设计、编程,熟练掌握UML、安卓应用、微信小程序开发,精通Python、Java语言并长期研究各种编程语言的设计模式。公众号“面向对象思考”。

薛卫民
1999年毕业于东北大学,2003年赴日本从事软件开发工作至今,现为日本某知名电子医疗设备制造公司框架设计开发团队的主要成员,负责医疗设备软件的框架设计和开发工作。拥有13年面向对象设计开发经验·,熟练掌握统一建模语言(UML),精通C++、Python、C#等编程语言。
前言
写书不是一件容易的事,因为许多自以为想得很清楚的事情,一旦用文字来表达总感觉有些语焉不详。同时,将自己写的代码公开需要很大的决心,代码的规范性、正确性等都是需要考虑的问题。幸运的是,各位读者还是看到了这本书。笔者认为,对于那些刚接触面向对象开发的人,或者已经具备基本知识却不知道如何运用的开发者,拥有一本结合开发实践Python 设计模式的书是很有必要的。笔者结合自己二十多年的开发工作经验,将关于面向对象和设计模式的知识通过Python 语言展示给各位读者。面向对象、设计模式的初学者通过本书可以快速入门;已经基本掌握设计模式的开发者通过本书可以理解设计模式在实际开发中的运用,从而能够合理、有效地选择设计模式。
关于设计模式
在实际开发中运用设计模式有利于设计出扩展性更好、更规范的软件架构。在软件开发过程中,总有部分内容是设计者凭直觉得出的结论,但是凭直觉得出的结论不可避免地会出现不易理解的内容。通过运用设计模式,可以在另一个高度上审视自己的设计。面向对象的开发很多时候是基于规则的,越早使用规则,越能在早期发现问题,越能开发出独立性强、扩展性好的软件,而设计模式就是经过实践证明的诸多规则的最佳实践。
理解了设计模式相当于掌握了一种更高级的设计语言。在考虑设计方案时,一个设计模式的名称就可以表达很多信息,这样可以大大节约设计的时间,提高沟通的效率。
笔者身边很多程序员的记忆力非常好,很擅长调试程序,但是让他们描述自己的设计,他们却会感觉很困难。这时如果使用设计模式语言,就可以大大改善这种状况。设计模式语言可以让开发者之间的沟通更顺畅,让设计资料的思路更清晰。
本书的构成
在本书中提到的设计模式都是面向对象领域耳熟能详的内容,为了让读者更好地理解这些内容,本书通过如下方式对其进行说明。
1.问题说明
本书力争通过PyExecutor 中的实例,使读者理解设计模式想要解决的问题。问题说明部分的内容可以看作设计模式的运用场景,而理解场景和设计模式的关系正是选择和运用设计模式的关键。当然,设计模式的运用场景并不限于问题说明中的实例,这一点请读者务必理解。
2.模式结构
设计模式是若干类协同完成复杂功能的方式,模式结构用来说明设计模式中每个类的职责、分工,以及类与类之间是如何协同工作的。读者通过阅读这部分内容,可以对设计模式有一个大致理解。模式结构重点说明的是设计模式的静态信息,其动态信息可以结合示例代码进行理解。
3.示例代码
为了让读者对模式结构中的内容加深理解,示例代码会提供可以执行的代码。代码的内容可能是模式结构的简单实现,也可能会结合一个简单的示例,总之不会离设计模式本身的内容太远。所有代码都是可以执行的,读者最好在自己的电脑上输入并调试这些代码,这样可以加深对设计模式的理解,因为很多东西只有在程序运行时才能看出来。
4.实战运用
示例软件PyExecutor 包含了书中介绍的23 个设计模式。如果原封不动地照搬设计模式,是无法获得理想的结果的。无论是设计模式本身,还是运用设计模式的对象,都需要根据实际情况进行相应调整,实战运用中的内容就是这方面的示例。由于PyExecutor 的规模比较大,所以本书不会展示其所有代码,读者最好通过下载链接获得代码,再结合书中的说明,边调试边理解代码。
5.效果讨论
效果讨论主要用来说明使用设计模式可以解决的问题,以及设计模式为软件带来的优势。通过对示例的说明,读者已经对设计模式有了自己的认识,这时再去理解设计模式,可以达到事半功倍的效果。
6.提示和技巧
任何事物都不可能只有优点没有缺点,设计模式也是如此。提示和技巧一方面会说明使用设计模式的注意事项,另一方面也会提供一些深入运用设计模式的建议。
阅读本书的几点建议
设计模式多种多样,其本质就是对需要替换的、变更的内容进行抽象处理,然后再运用多态技术对功能进行扩展,简单地讲就是,想变什么就抽象什么,这应该是学习和理解设计模式的最重要的9 个字了。
在学习设计模式时经常遇到的一个问题就是,很多设计模式的类图都很相似,在实际运用时不知道应该选择哪一个。出现这个问题的最大原因就是将类图当成设计模式的依据了。由于面向对象设计唯一的“大招”就是多态,所以很多设计模式的构造看起来或多或少都有些相似。比较合理的步骤是先根据场景选择设计模式,然后根据设计模式构造(形式)调整类的职责、接口和协作关系。
有些开发者反对设计模式的一个原因就是,使用设计模式容易出现过度设计。关于这个问题,笔者的观点是:过度设计当然不好,但是这并不是设计模式的错,而是开发者的问题。这和难以理解的接口、混乱的代码是同样的问题。为避免过度设计就不花时间和精力使用设计模式进行设计,就有点因噎废食了。
关于类图
本书中的类图都是按照UML 规范绘制的,但是考虑到不是所有读者都掌握了UML 知识,所以这里对其进行简单说明。
图0-1 中的每个方框均代表一个类,这个类被横线分为上下两部分:横线上面是该类的类名,横线下面是该类的多态操作(斜体)或方法(正体)。UML 类图也有分为上、中、下三部分的情况,这时中间的区域显示的是类的属性。
图0-1 中的带箭头的虚线表现的是依赖关系,在大多数情况下它表明一个类会使用另一个类的功能。图0-1 中Director 类指向Builder 类的依赖关系表明Director 类会使用Builder 类的功能。
图0-1 中带空心三角形的有向虚线表现的是实现关系,这种关系的含义是一个类可以实现另一个类定义的接口。例如,图0-1 中ConcreteBuilder1 类指向Builder 类的实现关系,表示ConcreteBuilder1 类会实现Builder 类定义的接口。但是Python 语言比较特别的一点是:具象Builder 不一定需要一个具体的抽象Builder 类,只要实现者、利用者遵守相同的约定,即可实现利用者和提供者之间的调用关系。这种情况在Python 语言中有一个定义—— protocol。对于这种可选的抽象基类,本书会指定一个<>衍型来表明这种关系。
图0-1 类图示例1
除此之外,本书还用到了继承关系,它表现为带空心三角形的实线,这种关系在UML 中被称为泛化,在图0-2 中Leaf 类指向Component 类的关系就属于这种情况。
这种情况也可以说Leaf 类是Component 类的派生类。
图0-2 类图示例2
类之间的实线表示这两个类之间存在关联关系,即这两个类需要协同工作。图0-2中带有一个箭头的实线表明两个类间的这种关联关系是单向的,而没有箭头的实线表明两个类间的这种关联关系是双向的。
图0-2 中一端为实心菱形的关联关系表明整体和部分的关系,其中实心菱形端是整体。这种关系表明当整体消失时,部分也会随着消失,这种关系被称为组合关系。
组合关系类似于笔记本电脑和屏幕的关系。部分和整体的关系也有用空心菱形表示的,虽然其含义和组合关系的含义相似,但是整体和部分可以单独存在,这种关系被称为聚合关系。聚合关系类似于台式电脑和显示器的关系。
程序员的语言
将自己写的代码公开需要很大的勇气,有很多程序员甚至不敢在自己写出的代码上签名。在本书中使用的PyExecutor 是笔者为了说明设计模式而开发的一个模拟项目,由于时间和能力的限制,书中的代码只写到能将设计模式讲清楚的程度,离真正的产品还有很远的距离。如果读者希望将这些代码运用到自己的工作中,那么还需要对其进行完善和改进。书中关于设计模式、Python 语言和tkinter 库的用法也有不足之处,恳请各位读者批评指正。
致谢
感谢电子工业出版社的林瑞和编辑。本书从立意、结构的确定到内容的确认和整理,每个环节都得到了林编辑的建议和意见。毫不夸张地说,如果没有林编辑的努力,就不会有本书的面世。
感谢我的父母。他们两个人都没有读过什么书,但是他们不遗余力地培养孩子读书,时至今日,我们兄弟几人虽说没有出人头地,但做到了自食其力。
感谢我的夫人。夫人本来也是一个学霸,自结婚以后,她将大部分时间都花在家庭、孩子上,但是她一直无怨无悔。
感谢我的两个孩子。孩子们为这个家庭带来了活力,他们在自己成长的同时也见证了父母的成长。在本书写作过程中,他们也做出了自己的贡献。目前两个孩子都处在成长的重要阶段,在此希望我可以为他们树立榜样。

目录

目录
第1 章 示例软件介绍 ··········································································· 1
1.1 准备工作 ············································································ 1
1.1.1 源代码下载 ································································· 1
1.1.2 安装开发环境 ······························································ 1
1.2 启动 ·················································································· 1
1.3 功能说明 ············································································ 2
1.4 功能概要 ············································································ 3
1.4.1 编辑 ·········································································· 3
1.4.2 逻辑调试 ···································································· 6
1.4.3 文件管理 ···································································· 6
1.4.4 代码生成 ···································································· 6
第2 章 创建型模式 ·············································································· 7
2.1 抽象工厂模式 ······································································ 7
2.1.1 问题说明 ···································································· 7
2.1.2 模式结构 ···································································· 8
2.1.3 示例代码 ···································································· 9
2.1.4 实战运用 ··································································· 12
2.1.5 效果讨论 ··································································· 19
2.1.6 提示和技巧 ································································ 19
2.2 工厂方法模式 ····································································· 19
2.2.1 问题说明 ··································································· 19
2.2.2 模式结构 ··································································· 21
2.2.3 示例代码 ··································································· 22
2.2.4 实战运用 ··································································· 24
2.2.5 效果讨论 ··································································· 26
2.2.6 提示和技巧 ································································ 26
2.3 原型模式 ··········································································· 27
2.3.1 问题说明 ··································································· 27
2.3.2 模式结构 ··································································· 28
2.3.3 示例代码 ··································································· 29
2.3.4 实战运用 ··································································· 30
2.3.5 效果讨论 ··································································· 34
2.3.6 提示和技巧 ································································ 34
2.4 生成器模式 ········································································ 35
2.4.1 问题说明 ··································································· 35
2.4.2 模式结构 ··································································· 37
2.4.3 示例代码 ··································································· 38
2.4.4 实战运用 ··································································· 42
2.4.5 效果讨论 ··································································· 43
2.4.6 提示和技巧 ································································ 44
2.5 单例模式 ··········································································· 44
2.5.1 问题说明 ··································································· 44
2.5.2 模式结构 ··································································· 45
2.5.3 示例代码 ··································································· 46
2.5.4 实战运用 ··································································· 47
2.5.5 效果讨论 ··································································· 50
2.5.6 提示和技巧 ································································ 50
2.6 创建型模式小结 ·································································· 50
第3 章 结构型模式 ············································································· 52
3.1 组合模式 ··········································································· 52
3.1.1 问题说明 ··································································· 52
3.1.2 模式结构 ··································································· 53
3.1.3 示例代码 ··································································· 54
3.1.4 实战运用 ··································································· 57
3.1.5 效果讨论 ··································································· 60
3.1.6 提示和技巧 ································································ 61
3.2 适配器模式 ········································································ 61
3.2.1 问题说明 ··································································· 61
3.2.2 模式结构 ··································································· 64
3.2.3 示例代码 ··································································· 64
3.2.4 实战运用 ··································································· 66
3.2.5 效果讨论 ··································································· 69
3.2.6 提示和技巧 ································································ 69
3.3 桥接模式 ··········································································· 70
3.3.1 问题说明 ··································································· 70
3.3.2 模式构造 ··································································· 72
3.3.3 示例代码 ··································································· 73
3.3.4 实战运用 ··································································· 76
3.3.5 效果讨论 ··································································· 79
3.3.6 提示和技巧 ································································ 80
3.4 装饰器模式 ········································································ 80
3.4.1 问题说明 ··································································· 80
3.4.2 模式结构 ··································································· 81
3.4.3 示例代码 ··································································· 82
3.4.4 实战运用 ··································································· 84
3.4.5 效果讨论 ··································································· 87
3.4.6 提示和技巧 ································································ 88
3.5 代理模式 ··········································································· 88
3.5.1 问题说明 ··································································· 88
3.5.2 模式结构 ··································································· 90
3.5.3 示例代码 ··································································· 91
3.5.4 实战运用 ··································································· 94
3.5.5 效果讨论 ··································································· 96
3.5.6 提示和技巧 ································································ 96
3.6 享元模式 ··········································································· 96
3.6.1 问题说明 ··································································· 96
3.6.2 模式结构 ··································································· 97
3.6.3 示例代码 ··································································· 98
3.6.4 实战运用 ································································· 100
3.6.5 效果讨论 ································································· 104
3.6.6 提示和技巧 ······························································ 104
3.7 外观模式 ········································································· 104
3.7.1 问题说明 ································································· 104
3.7.2 模式结构 ································································· 106
3.7.3 实战运用 ································································· 106
3.7.4 效果讨论 ································································· 109
3.7.5 提示和技巧 ······························································ 110
3.8 结构型模式小结 ································································ 110
第4 章 行为模式 ·············································································· 111
4.1 职责链模式 ······································································ 111
4.1.1 问题说明 ································································· 111
4.1.2 模式结构 ································································· 113
4.1.3 示例代码 ································································· 113
4.1.4 实战运用 ································································· 115
4.1.5 效果讨论 ································································· 119
4.1.6 提示和技巧 ······························································ 119
4.2 观察者模式 ······································································ 119
4.2.1 问题说明 ································································· 119
4.2.2 模式结构 ································································· 120
4.2.3 示例代码 ································································· 121
4.2.4 实战运用 ································································· 123
4.2.5 效果讨论 ································································· 127
4.2.6 提示和技巧 ······························································ 127
4.3 中介者模式 ······································································ 128
4.3.1 问题说明 ································································· 128
4.3.2 模式结构 ································································· 129
4.3.3 示例代码 ································································· 130
4.3.4 实战运用 ································································· 132
4.3.5 效果讨论 ································································· 133
4.3.6 提示和技巧 ······························································ 134
4.4 策略模式 ········································································· 134
4.4.1 问题说明 ································································· 134
4.4.2 模式结构 ································································· 136
4.4.3 示例代码 ································································· 137
4.4.4 实战运用 ································································· 139
4.4.5 效果讨论 ································································· 144
4.4.6 提示和技巧 ······························································ 145
4.5 命令模式 ········································································· 145
4.5.1 问题说明 ································································· 145
4.5.2 模式结构 ································································· 146
4.5.3 示例代码 ································································· 148
4.5.4 实战运用 ································································· 150
4.5.5 效果讨论 ································································· 154
4.5.6 提示和技巧 ······························································ 154
4.6 备忘录模式 ······································································ 155
4.6.1 问题说明 ································································· 155
4.6.2 模式结构 ································································· 156
4.6.3 示例代码 ································································· 157
4.6.4 实战运用 ································································· 159
4.6.5 效果讨论 ································································· 161
4.6.6 提示和技巧 ······························································ 161
4.7 模板方法模式 ··································································· 162
4.7.1 问题说明 ································································· 162
4.7.2 模式结构 ································································· 163
4.7.3 示例代码 ································································· 164
4.7.4 实战运用 ································································· 168
4.7.5 效果讨论 ································································· 170
4.7.6 提示和技巧 ······························································ 170
4.8 迭代器模式 ······································································ 171
4.8.1 问题说明 ································································· 171
4.8.2 模式结构 ································································· 172
4.8.3 示例代码 ································································· 173
4.8.4 实战运用 ································································· 176
4.8.5 效果讨论 ································································· 179
4.8.6 提示和技巧 ······························································ 179
4.9 访问者模式 ······································································ 180
4.9.1 问题说明 ································································· 180
4.9.2 模式结构 ································································· 182
4.9.3 示例代码 ································································· 183
4.9.4 实战运用 ································································· 187
4.9.5 效果讨论 ································································· 191
4.9.6 提示和技巧 ······························································ 192
4.10 状态模式 ········································································ 193
4.10.1 问题说明 ······························································· 193
4.10.2 模式结构 ······························································· 194
4.10.3 示例代码 ······························································· 195
4.10.4 实战运用 ······························································· 203
4.10.5 效果讨论 ······························································· 206
4.10.6 提示和技巧 ···························································· 206
4.11 解释器模式 ····································································· 206
4.11.1 问题说明 ······························································· 206
4.11.2 模式结构 ······························································· 207
4.11.3 示例代码 ······························································· 208
4.11.4 实战运用 ······························································· 214
4.11.5 效果讨论 ······························································· 219
4.11.6 提示和技巧 ···························································· 220
4.12 行为模式小结 ·································································· 220

读者评论

  • 能下,亲。要注册。刚下好的。

    flykid发表于 2023/7/2 9:56:05
  • 下载不了,邮件也没有收到,注册不了

    无情勇哥发表于 2022/9/29 18:05:52
  • 全国人民搞尼玛。博文视点有几个账号系统,左登录右注册再关联的,让费我时间。电子工业出版社的书以后少买!。

    jc发表于 2021/9/16 23:38:58
  • 什么玩意啊!代码为什么是异常的?书籍内容组织混乱,上来就从项目中间去讲,自说自话。

    yf_web发表于 2021/7/30 14:48:53

下载资源