描述
开 本: 16开纸 张: 胶版纸包 装: 平装-胶订是否套装: 否国际标准书号ISBN: 9787121361128
Python时代大话设计模式,概念通俗实现简单程序强悍贴近实战,从经典设计模式到衍生的各种编程机制再到经验,码农翻身及BAT众专家力荐,程序员夯实基础、扩展思路、设计更好软件必备。
★独辟蹊径,从生活中的例子出发逐渐上升概念定义
★归纳每种模式的具体应用场景、特点、注意事项等
★给出每种模式在现实中的应用案例,非常贴近实战
★归纳这个设计模式的具体应用场景、特点、注意事项
★不仅有经典设计模式,还有各种相关编程机制和经验
设计模式涉及非常多的软件架构知识和设计思想
设计模式利于系统便携性、健壮性、维护性、拓展性
程序员夯实基础扩展思路谋求设计出更好的软件必备!!
三年前,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“小朋友”,在封面设计过程中提出的非常细致的改进意见!
★学好设计模式能帮我们写出更好的代码,而这本书“由浅入深”的写作方式能让你轻松愉悦地进行学习。书中每章以一个轻松有趣的故事开始,讲述的是一个程序员日常的小故事,语言简练,很有画面感,所以非常容易理解;从生活的哲学中感受设计模式,这就是“由浅”。然后用简单的Python代码模拟实现生活中的场景,从而引出设计模式的模型和原理,归纳这个设计模式的具体应用场景、特点、注意事项等;从具体到抽象的提炼总结,让你洞察设计模式的本质,这就是“入深”。初学者可以通过本书非常轻松地学会各种模式,专家可以将本书作为参考书随时查阅。
★本书每章都有一个小故事,代入感比较强,很适合软件设计模式的初学者,结合故事的例子,用代码通俗易懂地把设计模式讲出来,很棒!
★在互联网工程中,良好的设计模式对系统的便携性、健壮性、维护性、拓展性起着至关重要的作用。设计模式涉及非常多的软件架构知识和设计思想,面对晦涩知识时,初学者往往容易陷入迷茫。罗伟富的这本书从生活出发,用生活语言将晦涩难懂的知识娓娓道来,让人茅塞顿开,实为设计模式领域不可多得的一本好书。
★本书把设计模式的高内聚、低耦合的设计理念,用故事情节的形式还原为真实场景,且用Python语言作为示例,简单、易学。
★一本好书的优秀之处在于能把高深的理论用浅白有趣的语言传达给读者,我想本书做到了这一点,因为并非科班出身的我也读得津津有味。本书从生活中提炼设计模式,看似是为了方便大家理解而采取的巧妙办法,实际上体现了面向对象编程范式的内涵,即对现实世界的模拟。所以这是一本“来源于生活,而又高于生活”的书。
| 纪鹏程 | “从生活中领悟设计模式(Python)”课程读者
22.1 从生活中领悟对象池技术
22.1.1 故事剧情—共享让出行更便捷
大学室友也是死党Sam首次来杭州,作为东道主的Tony自然得悉心招待,不敢怠慢。这不,既要陪吃陪喝,还要陪玩,哈哈!
第一次来杭州,西湖是非去不可的。正值周末,风和日丽,最适合游玩。上午9点出发,Tony和Sam打一辆滴滴快车从滨江到西湖的南山路。然后从大华饭店步行到断桥,穿过断桥,漫步白堤,游走孤山岛,就这样一路走走停停,闲聊、拍照,很快就到了中午。中午他们在岳王庙附近找了一家生煎店,简单解决了午餐(大餐留着晚上吃)。因为拍照拍得比较多,手机没电了,正好看到店里有共享充电宝,便借了一个给手机充电,多休息了一个小时。下午,他们准备沿着最美的西湖路骑行。吃完午饭,他们找了两辆共享自行车,从杨公堤开始骑行,路过太子湾、雷峰塔,然后到柳浪闻莺。之后沿湖步行走到龙翔桥,找了一家最具杭州特色的饭店解决晚餐……
这一路行程从共享汽车(滴滴快车)到共享自行车,再到共享充电宝,共享的生活方式已渗透到了生活的方方面面。共享,不仅让我们出行更便捷,而且更节约资源!
22.1.2 用程序来模拟生活
共享经济的飞速发展改变了我们的生活方式,例如共享自行车、共享雨伞、共享充电宝、共享KTV等。共享让我们的生活更便利,你不用带充电宝,却可以随时用到充电宝;共享让我们更节约资源,你不用买自行车,但能随时骑到自行车(一辆车可以为多个人服务)。我们以共享充电宝为例,用程序来模拟一下它是怎样做到资源节约和共享的。
源码示例22-1 模拟故事剧情
class PowerBank:
“””移动电源”””
def __init__(self, serialNum, electricQuantity):
self.__serialNum = serialNum
self.__electricQuantity = electricQuantity
self.__user = “”
def getSerialNum(self):
return self.__serialNum
def getElectricQuantity(self):
return self.__electricQuantity
def setUser(self, user):
self.__user = user
def getUser(self):
return self.__user
def showInfo(self):
print(“序列号:%s 电量:%d%% 使用者:%s” % (self.__serialNum, self.__electricQuantity, self.__user) )
class ObjectPack:
“””对象的包装类
封装指定的对象(如充电宝)是否正在被使用中”””
def __init__(self, obj, inUsing = False):
self.__obj = obj
self.__inUsing = inUsing
def inUsing(self):
return self.__inUsing
def setUsing(self, isUsing):
self.__inUsing = isUsing
def getObj(self):
return self.__obj
class PowerBankBox:
“””存放移动电源的智能箱盒”””
def __init__(self):
self.__pools = {}
self.__pools[“0001”] = ObjectPack(PowerBank(“0001”, 100))
self.__pools[“0002”] = ObjectPack(PowerBank(“0002”, 100))
def borrow(self, serialNum):
“””借用移动电源”””
item = self.__pools.get(serialNum)
result = None
if(item is None):
print(“没有可用的电源!”)
elif(not item.inUsing()):
item.setUsing(True)
result = item.getObj()
else:
print(“%s电源 已被借用!” % serialNum)
return result
def giveBack(self, serialNum):
“””归还移动电源”””
item = self.__pools.get(serialNum)
if(item is not None):
item.setUsing(False)
print(“%s电源 已归还!” % serialNum)
测试代码:
def testPowerBank():
box = PowerBankBox()
powerBank1 = box.borrow(“0001”)
if(powerBank1 is not None):
powerBank1.setUser(“Tony”)
powerBank1.showInfo()
powerBank2 = box.borrow(“0002”)
if(powerBank2 is not None):
powerBank2.setUser(“Sam”)
powerBank2.showInfo()
powerBank3 = box.borrow(“0001”)
box.giveBack(“0001”)
powerBank3 = box.borrow(“0001”)
if(powerBank3 is not None):
powerBank3.setUser(“Aimee”)
powerBank3.showInfo()
输出结果:
序列号:0001 电量:100% 使用者:Tony
序列号:0002 电量:100% 使用者:Sam
0001电源 已被借用!
0001电源 已归还!
序列号:0001 电量:100% 使用者:Aimee
评论
还没有评论。