人人都懂设计模式:从生活中领悟设计模式(Python实现)(txt+pdf+epub+mobi电子书下载)


发布时间:2020-11-03 02:30:19

点击下载

作者:罗伟富

出版社:电子工业出版社

格式: AZW3, DOCX, EPUB, MOBI, PDF, TXT

人人都懂设计模式:从生活中领悟设计模式(Python实现)

人人都懂设计模式:从生活中领悟设计模式(Python实现)试读:

前言

三年前,CSDN推出了一个产品——ink,旨在提供一个高质量写作环境。那时,我想写一系列关于设计模式的文章,于是就在 ink 里开始写作,陆陆续续写了三篇文章,后来不知道什么原因这个产品下架了,我的三篇文章也没了,这事也就一直被我搁置下来。直到2017年,知识付费盛行,各类付费的社区、产品如雨后春笋般崛起,而技术类的付费阅读产品更是大行其道(GitChat便是其中一种)。在GitChat的盛情邀请之下,我写作设计模式这一系列文章的想法又重新被点燃。2017年年底,我开始在GitChat上写“从生活中领悟设计模式(Python)”课程。2018年,我对这一课程进行了一次升级。

随着这一课程被越来越多的读者熟知,不少出版社编辑找到我,他们觉得这一课程的内容非常有特色,希望能把它重新整理,仔细打磨,出版成书,于是便有了本书。

本书的特色

设计模式作为面向对象程序的设计思想和方法论,本身是非常抽象和难以理解的,需要有一定的代码量和编程经验才能更深入地理解。如果能用一种有趣的方式来讲解设计模式,将会使这些枯燥乏味的概念变得更易于理解!

本书每一章以一个轻松有趣的小故事开始,然后用代码来模拟故事剧情,再从模拟代码中逐步提炼出设计模式的模型和原理,最后配合一个具体的应用案例,告诉你每一种模式的使用方法和应用场景。以由浅入深的方式带你了解每一种模式,思考每一种模式,总结每一种模式。

本书力求用更通俗的语言阐述难懂的概念,用更简单的语法实现复杂的逻辑,用更短小的代码写出强悍的程序!希望能带给读者一种全新的阅读体验和思考方式。

内容概述

本书分为3篇:

● “基础篇”讲解了23种经典设计模式,其中19 种常用设计模式分别用单独的章节讲解,其余设计模式作为一个合集放在一章中讲解;

● “进阶篇”讲解了由基础设计模式衍生出的各种编程机制,包括过滤器模式、对象池技术、回调机制和MVC模式,它们在各大编程语言中都非常重要而且常见;

● “经验篇”结合工作经验和项目积累,分享了对设计模式、设计原则、项目重构的理解和看法。

读者对象

一线互联网软件开发者

如果你想提升面向对象的思维方式,提高自己的软件设计能力,本书会对你非常有帮助。本书每一章会抽象和总结出对应设计模式的模型和原理,并结合具体的应用案例告诉你该模式的应用场景、特点和注意事项。

IT职场新人

如果你是IT新人,想通过学习设计模式来提升自己的技术能力和代码理解能力,本书将非常适合你。本书每一章以一个轻松有趣的小故事开始,由浅入深地讲述一个模式,让你轻松愉悦地学会每一种模式。

对设计模式和编程思想感兴趣的人士

设计模式能让你的代码具有更高的可重用性、更好的灵活性和可拓展性,更易被人阅读和理解,因此学习设计模式是每一个程序员编程生涯中必不可少的一个环节。

为什么叫设计模式

什么是设计模式

设计模式最初是由GoF于1995年提出的。GoF全称是Gang of Four(四人帮),即Erich Gamma、Richard Helm、Ralph Johnson和John Vlissides。他们四人于1995年出版了一本书Design Patterns: Elements of Reusable Object-Oriented Software(翻译成中文是《设计模式:可复用面向对象软件的基础》),第一次将设计模式提升到理论高度,并将之规范化,该书提出了23种经典的设计模式。

设计模式是一套被反复使用、多数人知晓、无数工程师实践的代码设计经验的总结,它是面向对象思想的高度提炼和模板化。使用设计模式是为了让代码具有更高的可重用性、更好的灵活性和可拓展性,更易被人阅读和理解。

设计模式与生活有什么联系

我一直坚信:程序源于生活,又高于生活!程序的灵魂在于思维的方式,而思维的灵感来源于精彩的生活。互联网是一个虚拟的世界,而程序本身就是对生活场景的虚拟和抽象,每一种模式我都能在生活中找到它的影子。比如,说到状态模式,我能想到水有固、液、气三种状态,而人也有少、壮、老三个阶段;提起中介模式,我能立刻想到房产中介;看到装饰模式,我能联想到人的穿衣搭配……

设计模式是面向对象的高度抽象和总结,而越抽象的东西越难以理解。本书的写作目的就是降低设计模式的阅读门槛,以生活中的小故事开始,用风趣的方式,由浅入深地讲述每一种模式。让你再次看到设计模式时,不觉得它只是一种模式,还是生活中的一个“小确幸”!程序不是冷冰冰的代码,它还有生活的乐趣和特殊意义。

为什么要学设计模式

设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案。这些解决方案是众多软件开发人员经过相当长的一段时间的试验总结出来的。所以不管你是新手还是老手,学习设计模式对你都有莫大的帮助。

学习设计模式的理由有很多,这里只列出几个最现实的:(1)摆脱面试的窘境,不管你是前端工程师还是后端工程师,或是全端工程师,设计模式都是不少面试官必问的。(2)让你的程序设计能力有一个质的提升,不再写一堆结构复杂、难以维护的烂代码。(3)使你对面向对象的思想有一个更高层次的理解。

如何进行学习

熟悉一门面向对象语言

首先,你至少要熟悉一门面向对象的计算机语言。如果没有,请根据自己的兴趣、爱好或希望从事的工作,先选择一门面向对象语言(C++、Java、Go等都可以)进行学习和实战,对抽象、继承、多态、封装有一定的基础之后,再来阅读本书。

了解Python的基本语法

对Python的基本语法有一个简单了解。Python的语法非常简单,只要你有一定的(其他)编程语言基础,通过“第0章 启程之前,请不要错过我”的学习就能很快地理解Python的语法。

学会阅读UML图

UML(Unified Modeling Language)称为统一建模语言或标准建模语言,是面向对象软件的标准化建模语言。UML类图表示不同的实体(人、事物和数据)如何彼此相关,换句话说,它显示了系统的静态结构。想进一步了解类图中的各种关系,可参考阅读“第0章 启程之前,请不要错过我”的“0.2 UML精简概述”部分。

阅读本书

通过阅读本书内容,可以轻松愉快地学习设计模式和编程思想。本书“基础篇”“进阶篇”“经验篇”的内容是逐步进阶和提升的,但每一篇内的不同章之间是没有阅读的先后顺序的(第0章和有特殊说明的除外),每一章都单独成文,可从任意一章开始阅读。例如,对于基础篇的23种设计模式,你可以从中任意挑选一章开始阅读。

为什么选择Python

虽然设计模式与编程语言没有关系,它是对面向对象思想的灵活应用和高度概括,你可以用任何一种语言来实现它,但总归是需要用一种语言进行举例的。本书的所有示例代码均使用Python编写(有特殊说明的除外),选择Python主要基于以下两个原因。

弥补市场空缺

设计模式于1995由GoF提出,被广泛应用于热门的面向对象语言。目前用Java、C++描述的设计模式的书籍和资料已经非常多了,但用Python来描述的真是太少了;我在当当网上搜索“Python设计模式”,只有零星的几本书。而对于编程语言中排名前三的Python语言,这明显是不够的。Python已经越来越成熟,也越来越多地被使用,作为一个有技术追求的IT人,有必要了解一下基于Python代码的设计模式。

大势所趋,Python已然成风

C语言诞生于1972年,却随着UNIX的诞生才深深根植于各大操作系统;C++诞生于1983年,却因微软的可视化桌面操作系统才得以广泛传播;Java诞生于1995年,却因互联网的迅速崛起才变得家喻户晓;Python诞生于1991年,而下一场技术革命已然开始,AI时代已然到来,在AI领域中已经被广泛使用的Python必将成为下一个时代的第一开发语言!

最热门的AI开源框架PyTorch和TensorFlow都已经采用了Python作为接口和开发语言。除此之外,还有一堆AI相关的框架库,也都纷纷采用了Python,如SKlearn、PyML等。一门如此有前途的语言,我们必然是要去学习和使用的。

勘误和支持

由于本人水平和经验有限,书中难免会有一些错误或理解不准确的地方,恳请广大读者批评指正。

如果你在阅读过程中发现错误,或有更好的建议,欢迎发邮件给我(E-mail:luoweifu@126.com,永久有效)。

最新的勘误内容可通过以下方式查看:关注公众号“SunLogging”,在菜单栏中选择“我的书箱”→“最新勘误”。

致谢

从在 GitChat 上写课程,到与出版社合作,写完本书的书稿,大概经历了一年半的时间,经过无数次与编辑的反复校对。写作是一件非常考验人耐心和细心的事,为了让读者更易理解,有些章节我进行了反复的推敲和修改。比如,为了讲清楚单例模式的每一种实现方式的原理,硬是增加了两个附录,阅读了十几篇文章,并做了验证性的实验,整整花了三周时间才写完。

感谢每一位在本书写作过程中给予帮助的人,是你们的鼓励和支持,才让本书能顺利完成。在此,要特别感谢电子出版社的首席策划编辑董英,在写书过中给予的诸多建议;也感谢GitChat的编辑马翠翠,在写线上课程“从生活中领悟设计模式(Python)”时给予的很多帮助;还要感谢Sophia“小朋友”,在封面设计过程中提出的非常细致的改进意见!最后,我也要感谢我的朋友和同事对我写书的鼓励和支持。

还要感谢Sophia“小朋友”,在封面设计过程中提出的非常细致的改进意见!基础篇Everybody Knows Design Patterns第0章 启程之前,请不要错过我0.1 Python精简入门

设计模式与编程语言没有关系,它是对面向对象思想的灵活应用和高度概括,你可以用任何一种语言来实现它,但还是需要用一种语言来举例。除特别说明外,本书的所有示例源码,均采用 Python 实现。如果你初次接触 Python,请务必先阅读本章的内容;如果你已经很熟悉Python,可直接跳过本章的内容。0.1.1 Python的特点

Python崇尚优美、清晰、简单,是一种优秀并被广泛使用的语言。

与Java和C++这些语言相比,Python最大的几个特点是:(1)语句结束不用分号“;”。(2)代码块用缩进来控制,而不用大括号“{}”。(3)变量使用前不用事先声明。

从其他语言刚转到Python的时候可能会有点不适应,用一段时间就好了!

个人觉得,在所有的高级计算机语言中,Python是最接近人类的自然语言的。Python的语法、风格都与英文的书写习惯非常接近,Python 的这种风格被称为 Pythonic。如条件表达式,在Java和C++语言中是这样的:

而在Python语言中是这样的:

有没有觉得第二种方式更接近人类的自然思维?0.1.2 基本语法

1.数据类型

Python是一种动态语言,定义变量时不需要在前面加类型说明,而且不同类型之间可以方便地相互转换。Python有五个标准的数据类型:(1)Numbers(数字)(2)String(字符串)(3)List(列表)(4)Tuple(元组)(5)Dictionary(字典)

其中 List、Tuple、Dictionary 为容器,将在下一部分介绍。Python 支持四种不同的数字类型:int(有符号整型)、float(浮点型)、complex(复数)(说明:Python 3中已去除long类型,与int类型合并)。

每个变量在使用前都必须赋值,变量赋值以后才会被创建。

源码示例0-1

输出结果:

2.常用容器

1)List

List(列表)是Python中使用最频繁的数据类型,用“[]”标识。列表可以完成大多数集合类的数据结构实现,类似于Java中的ArrayList和C++中的Vector。此外,一个List中还可以同时包含不同类型的数据,支持字符、数字、字符串,甚至可以包含列表(即嵌套)。(1)列表中值的切割也可以用到变量[头下标:尾下标],这样就可以截取相应的列表,从左到右索引默认从0开始,从右到左索引默认从-1开始,下标可以为空(表示取到头或尾)。(2)加号(+)是列表连接运算符,星号(*)是重复操作。

源码示例0-2

输出结果:

2)Tuple

Tuple(元组)是另一种数据类型,用“()”标识,内部元素用逗号隔开。元组不能二次赋值,相当于只读列表,用法与List类似。Tuple相当于Java中的final数组和C++中的const数组。

源码示例0-3

输出结果:

3)Dictionary

Dictionary(字典)是Python中除列表以外最灵活的内置数据结构类型。字典用“{ }”标识,由索引(key)和它对应的值value组成。相当于Java和C++中的Map。

列表是有序的对象集合,字典是无序的对象集合。两者之间的区别在于:字典中的元素通过键存取,而不通过偏移存取。

源码示例0-4

结果:

3.类的定义

使用class语句来创建一个新类,class之后为类的名称并以冒号结尾,实例如下:

类的帮助信息可以通过 ClassName._doc_查看,类体(class_suite)由类成员、方法、数据属性组成,举例如下。

源码示例0-5

其中_init_为初始化函数,相当于构造函数。

1)访问权限

● _foo_:定义的是特殊方法,一般是系统定义名字,类似_init_()。

● _foo:以单下画线开头时表示的是 protected 类型的变量,即保护类型只允许其本身与子类进行访问,不能用于 from module import *。

● __foo:以双下画线开头时,表示的是私有类型(private)的变量,即只允许这个类本身进行访问。

2)类的继承

类的继承语法结构如下:

Python中继承中的一些特点:(1)在继承中基类的初始化方法_init_()不会被自动调用,它需要在其派生类的构造中亲自专门调用。(2)在调用基类的方法时,需要使用super()前缀。(3)Python总是首先查找对应类型的方法,不能在派生类中找到对应的方法时,它才开始到基类中逐个查找(先在本类中查找调用的方法,找不到才去基类中找)。

如果在继承元组中列了一个以上的类,那么它就被称作“多重继承”。

3)基础重载方法

Python的类中有很多内置的基础重载方法,我们可以通过重写这些方法来实现一些特殊的功能。这些方法如表0-1所示。表0-1 基础重载方法0.1.3 一个例子让你顿悟

我们将一段 Java 代码对应到 Python 中来实现,进行对比阅读,相信你很快就能明白其中的用法。

源码示例0-6 Java代码

源码示例0-7 对应的Python代码

源码示例0-6和源码示例0-7的结果是一样的,如下:0.1.4 重要说明(1)为了降低程序复杂度,本书用到的所有示例代码均不考虑多线程安全,望借鉴源码的读者注意。(2)本书所有源码均在Python 3.6.3下编写,Python 3.0以上都可以正常运行。(3)源码地址:https://github.com/luoweifu/PyDesignPattern,本书所有源代码可在此免费阅读和下载。0.2 UML精简概述0.2.1 UML的定义

UML是英文 Unified Modeling Language 的缩写,简称UML(统一建模语言),它是一种由一整套图组成的标准化建模语言,用于帮助系统开发人员阐明、设计和构建软件系统。

UML 的这一整套图被分为两组,一组叫结构性图,包含类图、组件图、部署图、对象图、包图、组合结构图、轮廓图;一组叫行为性图,包含用例图、活动图(也叫流程图)、状态机图、序列图、通信图、交互图、时序图。其中类图是应用最广泛的一种图,经常被用于软件架构设计中。0.2.2 常见的关系

类图用于表示不同的实体(人、事物和数据),以及它们彼此之间的关系。该图描述了系统中对象的类型以及它们之间存在的各种静态关系,是一切面向对象方法的核心建模工具。

UML 类图中最常见的几种关系有:泛化(Generalization)、实现(Realization)、组合(Composition)、聚合(Aggregation)、关联(Association)和依赖(Dependency)。这些关系的强弱顺序为:泛化=实现 > 组合 > 聚合 > 关联 > 依赖。

1.泛化

泛化(Generalization)是一种继承关系,表示一般与特殊的关系,它指定了子类如何特化父类的所有特征和行为。

如:哺乳动物具有恒温、胎生、哺乳等生理特征,猫和牛都是哺乳动物,也都具有这些特征,但除此之外,猫会捉老鼠,牛会耕地,如图0-1所示。图0-1 泛化

2.实现

实现(Realization)是一种类与接口的关系,表示类是接口所有特征和行为的实现。

如:蝙蝠也是哺乳动物,它除具有哺乳动物的一般特征之外,还会飞,我们可以定义一个IFlyable的接口,表示飞行的动作,而蝙蝠需要实现这个接口,如图0-2所示。图0-2 实现

3.组合

组合(Composition)也表示整体与部分的关系,但部分离开整体后无法单独存在。因此,组合与聚合相比是一种更强的关系。

如:我们的电脑由CPU、主板、硬盘、内存组成,电脑与CPU、主板、硬盘、内存是整体与部分的关系,但如果让CPU、主板等组件单独存在,就无法工作,因此没有意义,如图0-3所示。图0-3 组合

4.聚合

聚合(Aggregation)是整体与部分的关系,部分可以离开整体而单独存在。

如:一个公司会有多个员工,但员工可以离开公司单独存在,离职了依然可以好好地活着,如图0-4所示。图0-4 聚合

5.关联

关联(Association)是一种拥有关系,它使一个类知道另一个类的属性和方法。关联可以是双向的,也可以是单向的。

如:一本书会有多个读者,一个读者也可能会有多本书,书和读者是一种双向的关系(也就是多对多的关系);但一本书通常只会有一个作者,是一种单向的关系(就是一对一的关系,也可能是一对多的关系,因为一个作者可能会写多本书),如图0-5所示。

试读结束[说明:试读内容隐藏了图片]

下载完整电子书


相关推荐

最新文章


© 2020 txtepub下载