前言
OOP(Object-Oriented Programming)早已不是一个新概念了,OOP在最近的20多年里发展得异常迅猛,特别是近10年里,OOP相关技术层出不穷,当大家热衷于使用这些新技术时,却不会使用OOP进行软件设计,进而发现新的技术并没有为大家带来任何好处。
很多老的开发人员从过程式开发转向面向对象的开发过程中,由于他们习惯过程式思维的开发,尽管他们使用的是OOP语言,但这并没有给他们带来太多帮助,反而使他们更加厌倦OOP软件开发,认为OOP没有想象中的那么便捷,很多地方没有使用过程式开发来的便捷,于是他们又退化为过程式的开发。
随着越来越多的新开发人员也加入了OOP的潮流,他们追求新的技术,学会使用各种工具和框架,却无暇顾及OOP进行开发设计的核心思想。虽然使用了新技术,代码质量并未提高,反而事与愿违。
当他们沉浸在新技术的使用和业务逻辑的编码实现时,未料到这些看似巧妙的设计导致了代码不易阅读、不易维护、不易扩展、不易测试、不易调试……。大家忙忙碌碌,但是项目进度缓慢,最终往往以失败而告终。归根结底,尽管使用了OOP语言开发其他一些新技术,但对OOP只限于粗浅的了解和相关语言语法使用上的理解,并不会真正使用OOP进行开发设计,以致使用时颠三倒四,未能真正享受到OOP和这些新技术带来的好处,有些新技术非但没有提供帮助,反而成为某些软件失败的罪魁祸首。那么,如何使用OOP进行开发设计呢?
OOP开发新手由于没有这方面的设计经验,在遇到问题时,往往诉求于逻辑的实现,在维护性和扩展性没有考虑或者少有考虑,导致代码乱七八糟,七零八散,随着开发的深入,最终在用户各种各样的需求面前无以应对。而有经验的OOP开发人员会灵活使用各种模式做出优秀的设计,编写的代码健壮性高,易于阅读、维护和扩展,可伸缩性强,开发成本也十分低廉。如果重用他们的开发经验,那么你就不需要在相同问题上重蹈覆辙,也能设计出优秀的软件。
市面上介绍设计模式的书籍非常多,它们一般仅仅给出GoF的23个最基本的设计模式的定义和一些简单的示例,大多数读者充其量只能了解它们,在使用上大打折扣。
本书精心筛选出了一些我们经常在开发设计过程中使用到的模式,使用OOP的眼光分析它们,适时结合一些流行J2EE框架和技术,并从横向和纵向两方面扩展读者的思维,使读者对这些常用的模式有一个全面深刻的认识,也希望能够为正在使用这些框架和技术的读者带来帮助。
本书内容
作为一本技术书籍,严谨是必须的,作者参考了大量资料和文献,并在相关重要地方注明出处,做到有理有据,希望能够从专业角度和用户探讨设计模式与面向对象的设计。
严谨和可读性是没有冲突的,在开发人员之间交流,最好的方式莫过于优质代码了,本书给出了大量代码片段,在一些重要的地方使用黑体、加粗或斜体的字体,并做了详细解释,希望能够抛砖引玉,帮助读者制作出更加出色的代码。另外,本书还添加了很多图片,希望图文并茂,使这本书更加容易阅读。
本书主要分为五篇。
第一篇:模式介绍(第1章~第2章)
第1章讲述了面向对象与模式之间的关系和模式的简史;在第2章介绍了第一个简单的模式,模板方法模式,在这章,我们分析了代码重复所导致的“腐臭气味”,重复的代码是代码“臭味”中最糟糕的,在以后章节将会介绍各种模式来避免代码重复。
第二篇:创建对象(第3章~第6章)
使用OOP语言的语法创建一个对象并不复杂,例如在Java语言中使用new即可。但是随着系统变得越来越复杂,使用new直接创建对象会给系统造成很高的耦合度。创建模式可以封装对象实例化的过程,把使用对象的功能和实例化对象解耦开来,从而降低了耦合度。
在本篇最后,讨论了现在最流行的两个概念,IoC和DI,这二者是目前流行的轻量级容器的基础。
第三篇:构建复杂结构(第7章~第11章)
有时候,创建新的、更强功能的类并不需要重新编写代码,装配已有的类和对象反而更加快捷,也更加灵活。本篇讨论了一些常用的组装对象的模式,你将发现,构建大的、功能更强的对象,不是只有多层继承才能实现,组合往往是最有效的方式,本篇将会看到如何使用继承和组合创建复杂的大结构。
第四篇:行为模式(第12章~第14章)
我们在程序中经常需要封装一些对象的行为或者对象之间的通信,本篇将会讲述三个常用的行为模式:策略模式,状态模式和观察者模式,加上第2章介绍的模板方法模式,本书将一共讲述这四个常用的行为模式。
第五篇:终点还是起点(第15章~第17章)
其实,在很早之前,就有人对面向对象思想的局限性进行了研究,提出了一种新的编程方法AOP,第15章将会介绍AOP的概念及其实现技术。
尽管在前面章节,我们学习了一些常用的模式和一些OO设计的原则,并且了解了AOP方面的一些知识,但这些并不能表示我们已具备解决复杂领域问题的能力,在第16章我们讨论了在实际开发过程中如何使用面向对象进行开发设计以及应该注意的一些问题。
在本篇末尾,第17章,将回顾本书的内容,重新认识OOP设计规范。
最后两章虽然没有直接讲解模式,但却是本书极为重要的部分,开始带领大家思考如何进行软件设计。
附录
本书附录A介绍了一些作者非常喜欢且推荐的书籍,以及一些经常浏览的技术网站和论坛,希望读者也能够获益。
参考文献。
本书读者
本书不是一本面向对象和Java语言的入门书籍,阅读对象主要是从事Java语言的软件开发人员但不限于Java语言的开发人员。
希望读者了解这些Java基本技术:反射、内部类、序列化、线程、动态代理、垃圾回收、类加载器以及Java对象的引用类型等。
本书中会使用到UML的一些图示,主要包括静态类图和时序图等。
希望读者了解或者使用过这些框架和技术:JDBC、Hibernate、Jpa、Spring、Ejb、Pico Container、Guice、XWork、Webwork、Struts和EasyMock等。由于在实际的J2EE开发过程中,我们经常使用到这些框架,笔者将在讲述过程中适时结合这些框架与技术,用以消除因不理解这些技术而造成对模式理解上产生问题。如果读者还想做进一步的了解,可以参看我给大家推荐的相关书籍和网站。
对于其他语言学习者,由于文中有详细的代码解释,只要有OOP语言基础,相信能够看懂示例代码,可以重点关注于对问题的分析和OO眼光来看待这些设计模式。
对于Java初学者,对于提到的相关框架和技术,可以根据作者的介绍说明,重点专注于对问题的分析和OO眼光来看待这些设计模式,由于根据Java语法和技术的特点,扩展了一些模式,初学者可以根据作者介绍,更深入地体会这些语法和技术。
对于使用Java开发多年,却涉及J2EE方面的技术不深的读者来说,同样,重点专注于对问题的分析和OO眼光来看待这些设计模式,由于作者举了一些关于Java新语法和流行的技术,扩展了这些模式,可以作为参考学习,从多个角度扩展视野。
对于在J2EE开发多年的程序员来说,依然,你的重点还是要放在对问题的分析和OO眼光来看待这些设计模式之上,为了给读者广阔的视角,作者引用了大量流行的框架和技术,让读者能够理解这些框架和技术,有些示例可以直接拿过来解决这些常见的问题。
本书代码
要获取本书的示例代码,请登录http://code.google.com/p/rambling-on-design-patterns/,点击进入Downloads标签页,选择最新的版本下载。也可以安装svn客户端下载最新文件,svn地址为:http://rambling-on-design-patterns.googlecode.com/svn/trunk/。
为了能够让读者选择学习自己喜欢的章节并分别单独运行这些示例,作者尽量为每一种模式提供了相对独立和完整的代码。
注意:这些示例代码的运行环境是Java 2 Platform Standard Edition SDK V6.0及以上版本,代码使用了一些Java 5及以上的新语法和JDK的最新API,如果读者对它们还不熟悉,请查阅附录的相关推荐书籍。
反馈
尽管笔者尽最大努力去避免正文和代码中出现的任何错误,但是人无完人,书中难免有错误之处。如果读者在阅读过程中发现拼写错误,代码错误,以及内容有混淆之处,希望能够及时反馈,或许它们能够节省其他读者很多宝贵时间,也有利于完善本书,反馈邮箱是:ramblingondesignpatterns@gmail.com。
写后感
为了完成此书,笔者增删了5次,尽管艰辛,但在写书的过程中也发现了不少乐趣,也希望为读者在阅读过程中带来乐趣。