前言
软件设计模式是从业人员应具备的最重要的知识或技能之一。从GoF(Gang of Four,四人组)出版经典图书Design Patterns:Elements of Reusable Object-Oriented Software起,人们陆续发起了若干设计模式的讨论,有的侧重软件架构,有的强调程序的并发性能,还有的作为编程准则或规范等。当前,市场上对软件设计模式进行知识阐述与传播的图书已经足够多,它们从不同视角,以不同展示手法向读者传达了丰富的信息,但是仍然存在瓶颈,包括缺乏真实技术案例,过于偏重理论,抽象且入门门槛高,学习资源单调,等等。
针对以上问题,笔者做了以下努力。
1. 阅读大量开源技术的源码,抽取模式应用的真实案例
笔者使用约1/3的篇幅呈现了20多个开源技术源码中设计模式的应用案例,包括Struts、Spring、Hibernate、MyBatis、Event Bus、Dom4j等,详见人邮教育社区(http://www.ryjiaoyu.com)所提供的资源。
开源技术源码中的模式应用案例不仅提供了实例参考,也向学习者展示了资深(或权威)开发人员是如何使用设计模式解决实际业务问题的,这些对未入门(或刚入门)的读者来说是十分宝贵的学习指引。此外,依托经典案例,读者应侧重解读模式抽象理论与具体实践的不同,从而突破形式化的理论思维,达到灵活且恰当使用模式的目的。
例如,在书的第4.3节中讲到GoF定义了构造器模式的Director角色类,其职责为向客户端提供构造产品对象的接口;而在大多开源技术中,开发人员为了简化设计方案,并不单独定义Director角色类。还有很多其他模式案例亦是如此,读者可以留意相关内容。
2. 以解决具体设计问题为出发点,详细阐述模式的使用方法
针对每个具体模式的阐述,笔者均用COS系统(见附录)代码设计问题作为切入点,按分析问题→设计方案→实现代码的思路描述如何恰当地使用模式解决目标问题。特别地,在使用相关模式时,开发人员要注意它们的设计代价(即成本)。
相比于现有图书,笔者弱化了模式的抽象概念,并未过多纠缠模式的抽象理论。比如,GoF原著作中会显式地分析不同模式的异同及相互关联,而本书并没有提及。因为,在笔者访谈的学习者中,有很多人会十分在意模式的形式正确性,而忽略了模式作为问题解决方案的本质,他们经常纠结于某个模式与其他模式的异同,却无法恰当且正确地使用它们。这显然是错误地定位了模式学习的着眼点。
模式是以设计问题为支撑的,如果没有设计问题,就不存在模式应用,学习者更不能脱离设计问题空谈模式。笔者尤其建议学习者不要拘泥于某个形式或理论,完全可以在实践中创建属于自己的模式。实际上,GoF当时也是这样做的,所以才有了GoF模式。
3. 开发相配套的慕课(MOOC)视频和可运行源码等多维度学习资源
现有图书向学习者提供的参考资源相对单调,除了书籍自身呈现的内容,并无太多辅助材料。为此,笔者特意在编写此书前,完成了软件设计模式MOOC视频的制作和COS案例源码的开发,并发布在公开平台上。读者可以访问人邮教育社区(http://www.ryjiaoyu.com)中提供的资源地址,按需获取开放的学习材料。
本书面向的读者为软件开发的从业人员,适合编码人员、软件设计师、需求分析师、技术架构师、产品经理及项目经理等人群。学习者在学习本书内容前,除应熟悉计算机及软件开发所需基础知识外,还需具备相关的领域知识,包括软件工程、Java面向对象编程、UML、数据库系统应用等。本书采用Java编程语言展示示例代码,使用UML 2.0建模语言可视化设计模型。此外,读者应具备一定的项目(或代码)开发经验。
全书共6章内容,概括如下。
第1章为学习基础,主要内容包括软件生命周期、软件开发方法、面向对象的概念与特征、UML使用等。学习者如已熟悉该内容,可略过。
第2章是面向对象设计原则,阐述了SOLID原则基本内涵、使用示例等。笔者建议读者着重关注SOLID原则的意图与使用注意事项。此外,常用的面向对象设计原则还有很多,限于篇幅,本书不能一一详述,还请学习者按需查阅相关资料以进一步了解。
第3章是设计模式入门,介绍了模式定义、GRASP模式和简单工厂模式。模式存在于生活的各个方面,是人们已有经验的总结与抽象。更重要地,模式是针对具体业务问题的已被无数次验证过的可行的解决方案。因此,通过本章学习,读者能掌握恰当运用模式解决代码设计问题的方法,并能熟知模式给设计带来好处的同时也具有对应的代价(或成本)。
第4章是GoF创建型模式。GoF创建型模式为对象创建的设计问题提供了解决方案参考,包括单例、原型、构造器等5种模式,每一种模式所适用的问题场景均不相同,也都有相应的设计代价。本章同时展示了JDK、Android SDK、Struts等开源技术或平台的模式案例,使读者感受真实且实用的知识实践体验。
第5章是GoF结构型模式,介绍了适配器、桥、组合等7种模式。这些模式灵活地运用组合/聚合、继承、接口等类关系设计了针对具体代码问题(例如解耦合、保护目标代码等)的实践方案。通过对Spring MVC、MyBatis等技术源码的剖析,本章从不同视角着力呈现了模式理论与具体实践之间的差异与联系。
第6章为GoF行为型模式,内容主要涉及责任链、命令、解释器等11种模式。业务行为是软件功能需求的实施,是受需求变化影响最大的软件元素,也是开发人员设计软件最重要的内容之一。GoF行为型模式展示了11种面向对象行为设计问题的通用实践方案。OGNL、Event Bus、NetBeans等案例也会让读者领会到资深开发人员是如何恰当且灵活地运用模式解决代码设计问题的。
本书编撰得到了如下项目资助:“教育部2017第一批产学合作协同育人”项目(名称:软件设计模式MOOC教材建设,编号:201701064015),“安徽省教育厅2017年度高等学校省级质量工程”教学研究项目(名称:软件工程硕士课程混合式教学模式研究—以《软件设计模式》为例,编号:2017jyxm0030),“安徽省教育厅2017年度高等学校省级质量工程”大规模在线开放课程(MOOC)示范项目(名称:软件设计模式,编号:2017mooc383)。
最后,感谢出版社刘博编辑和其他工作人员给予的建议与帮助!感谢我的学生在文字校验、图形绘制等方面给予的大力帮助,他们是胡杭、叶晓曦、陈灏、姚德义、龙海军、程起、王红钰、龚雨濛等!感谢欧开亮、韦宇轩、何林明、杜亚文等为MOOC视频制作提供的技术支持!感谢我的家人给予的关爱和鼓励!谢谢你们!
由于笔者自身的技术经验与知识视野有限,书中难免有疏漏之处,欢迎读者多指正!
朱洪军
2018年3月于苏州独墅湖畔