学习建议
在阅读本书前,首先,需要具备Java语言或其他面向对象语言的编程基础。为了降低阅读门槛,书中代码尽可能使用最基本的语法,对编程水平的要求并不高。其次,需要了解面向对象的特性封装、继承、多态。书中有大量的程序结构图,只要具备基础的UML知识,便可以读懂。
我建议,设计模式的初学者先阅读本书的前两章,在对设计模式有了一定程度的认知,并了解设计原则后,再开始学习各种设计模式。若在学习之初难以完全理解设计原则也不必担心,在后面的章节中,我会结合设计模式多次讲到常见的设计原则。书中对每种设计模式的讲解独立成章,读者既可以按顺序阅读,也可以按照自己的需要选择阅读。
本书从生活中常见的例子切入,展开对每种设计模式的讲解。读者可以跟随这些例子拓展思维,思考这样设计带来了什么收益、涉及哪些主体、主体间如何配合、各自的职责是什么。设计模式是一种思想,学习设计模式重在悟透设计思想,而不是急于用代码实现。
书中有大量的示例代码,建议读者在阅读的同时动手实践,以便加深记忆和理解。在工作中,如果想使用某种设计模式,可以参考这些代码,但真实的场景远比书中的例子复杂得多。读者可以先从形式上开始模仿,当能够灵活运用设计思想解决问题时,形式反而没那么重要了。大胆应用,是真正掌握设计模式的必经之路。
本书特色
本书采用老师与学生对话的形式进行讲解,为此我虚构了两个人物:学生是初入职场的程序员兔小白,老师是有着多年经验的开发经理熊小猫。
本书的写作特色如下。
(1)模拟一对一教学场景。技术图书通常是作者以第一人称进行讲解的,给我的阅读感受像是在听一位老师讲课。本书模拟一对一教学场景:我先站在老师的角度讲解,通过提问启发学生;然后切换身份,想象自己作为学生,在听完这段讲解后会提出什么问题。本书试图为读者营造身临其境地接受一对一教学的感受,在一问一答中探索设计模式的奥秘。
(2)从熟悉的生活场景切入。从日常生活中的一个小故事开始对每种设计模式进行讲解,让读者通过身边熟悉的事物来联想并了解设计模式。
(3)重现程序设计的演变过程。本书在提出问题后,并不立即使用设计模式解决问题,而是先从直觉化的程序设计开始,逐步演变到如何使用设计模式开发。熊小猫启发兔小白重构程序的过程正是开发者设计程序时的思考过程。
(4)大量的手绘插画。在讲解关键概念时,配以漫画辅助理解。人脑更乐于接收图像信息,对图像的记忆长度要远超文字。幽默风趣的漫画不仅可以加深印象,而且可以缓解学习时的枯燥感。
(5)独有的设计手法。设计原则是程序设计的理论基石,设计模式是特定问题的方案总结。二者之间其实还有很多设计小技巧,我称之为设计手法。设计手法不针对特定问题,而是达成设计原则的小技巧,不同的设计模式使用同样的设计手法。这好比在足球运动中,踢出弧线球是一种技巧,弧线球既可以用在传球的场景中,也可以用在射门的场景中。
本书内容
软件需要架构,图书同样需要架构。本书的内容架构分为3个部分。
第一部分为开篇,在正式讲解设计模式之前,简要介绍设计模式和设计原则。
第1章设计模式从何而来,主要介绍设计模式产生的背景。
第2章一体式电源与组合式电源软件设计原则,通过设计电脑电源的案例引出六大设计原则。
第二部分进入正题,讲解23种设计模式。
第3章想吃汉堡,自己做还是去汉堡店?简单工厂模式,通过兔小白如何取得一个汉堡的例子,引出简单工厂模式。简单工厂模式虽然简单且不在23种设计模式中,但是体现了多种设计原则。
第4章座座工厂平地起工厂方法模式,以专精程度更高的厨房为例,引出工厂方法模式。
第5章工厂品类要丰富抽象工厂模式,通过便利店更换关东煮供货商的例子,引出抽象工厂模式,并对3种工厂模式进行比较。
第6章组装电脑的学问生成器模式,通过总监负责电脑组装流程、工人负责具体步骤的例子,讲解生成器模式。
第7章还记得克隆羊多莉吗?原型模式,通过克隆羊的例子,引出原型模式。
第8章干活全靠我一人单例模式,通过项目经理身兼数职的例子,讲解单例模式。
第9章电源插座标准再多也不怕适配器模式,通过电源转接头的例子,讲解适配器模式。
第10章一桥飞架南北,天堑变通途桥接模式,通过游戏机和游戏卡分离的例子,讲解桥接模式。
第11章树状结构也是一种设计模式?组合模式,通过公司人力地图的例子,讲解组合模式。
第12章人靠衣装马靠鞍装饰模式,以美颜相机为例,讲解装饰模式。
第13章为什么加盟快餐店越来越多?外观模式,通过以加盟模式开快餐店的例子,讲解外观模式。
第14章棋类游戏中的设计模式享元模式,以在消消乐游戏中如何避免生成大量棋子实例为例,讲解享元模式。
第15章办事不必亲自出面代理模式,以代理办理签证为例,讲解代理模式。
第16章谁来决定需求变更的命运?职责链模式,以项目的一次需求变更审批为例,讲解职责链模式。
第17章操作再多,也不必手忙脚乱命令模式,以项目上线时团队成员如何配合为例,讲解命令模式。
第18章点菜也需要翻译解释器模式,通过饭店点菜终端将键盘输入转化为点菜单的例子,讲解解释器模式。
第19章地铁安检,谁都逃不掉迭代器模式,以地铁排队安检为例,讲解迭代器模式,并介绍Java中的迭代器实现。
第20章房产中介的存在价值中介者模式,以房产中介在租房业务中的作用为例,讲解中介者模式。
第21章物业通知,每户必达观察者模式,以物业发布通知为例,讲解观察者模式,并介绍Java中的观察者模式实现。
第22章甲方要求改回第一版备忘录模式,以数次改版演唱会海报设计为例,讲解备忘录模式。
第23章状态改变行为状态模式,以将立体车库的行为绑定在运行状态上为例,讲解状态模式。
第24章购买手机选项多,如何选购是难题策略模式,以根据不同的策略选购手机为例,讲解策略模式。
第25章遵循套路,不走弯路模板方法模式,以自动挡和手动挡汽车的起步操作为例,讲解模板方法模式。
第26章尊重个体差异,提供个性化服务访问者模式,以不同级别员工的年终奖计算差异为例,讲解访问者模式。
第三部分总结23种设计模式,提炼设计手法。
第27章设计模式总结,总结了面向对象、设计原则、设计模式三者的关系,并讲解从23种设计模式中提炼出来的10种设计手法。