在过去多年的软件开发和教学推广工作中,我时常能够听到这样的声音:
抽象类和接口到底有什么用?
继承不好吗?为什么有时候不用它来实现功能复用?
能不能在下次增加功能的时候不要修改源代码?每次都改,太麻烦了。
有没有一种方法能够减少类的个数?这么多类,太复杂了。
面向对象软件的可重用性不是很好吗?为什么我还是在不断编写相同的代码?
我学过设计模式,也看了好几本书,但实际开发时我还是不知道怎么运用这些模式?
……
你是否也曾有过上述疑问或者类似的感慨?如果有的话,那么本书将是你明智的选择。本书将结合大量项目实例来逐个讲解设计模式,讲述如何通过设计模式来解决上述问题,让读者能够快速提升自己的开发功力,真正理解和掌握每一个设计模式,在软件开发的内功修炼之道上迈出坚实的一步。
写作目的
设计面向对象软件比较困难,而设计可复用的面向对象软件就更加困难。
——GoF(1995)
软件开发是一门技术,更是一门艺术!
随着面向对象技术的发展和广泛应用,设计模式在软件开发和设计中的重要性不言而喻。作为软件开发人员,尤其是面向对象软件开发人员,设计模式已成为其内功修炼的重要组成部分之一。无论是面向对象的初学者还是具有一定经验的开发人员,都可以通过对设计模式的学习和使用来加深对面向对象思想的理解,从而开发出具有更好的可扩展性和复用性的软件。设计模式是前人经验的积累,它将让软件变得更像一个艺术品,而不是一堆难以维护和重用的代码。
作为一名从事模式使用和推广工作多年的教师兼开发人员,如何更好地将设计模式的思想和实践经验传递给他人是我一直思考的一个问题,于是我开始着手收集和整理这些年积累的一些与设计模式相关的项目实例和资源,经过无数个晚上的“挑灯夜战”,终于完成了本书的编写工作,借此为面向对象技术的推广尽一点绵薄之力。
本书结构及内容
本书分为4个部分,共26章。
第1部分: 基础知识,包含第1章和第2章,主要介绍与设计模式相关的基础知识,包括设计模式概述、UML类图、7个面向对象设计原则等内容,为后续设计模式的学习奠定基础。
第2部分: 创建的艺术,包含第3~8章,介绍6种常用的创建型设计模式,分别是单例模式、简单工厂模式、工厂方法模式、抽象工厂模式、原型模式和建造者模式。
第3部分: 组合的艺术,包含第9~15章,介绍7种常用的结构型设计模式,分别是适配器模式、桥接模式、组合模式、装饰模式、外观模式、享元模式和代理模式。
第4部分: 交互的艺术,包含第16~26章,介绍11种常用的行为型设计模式,分别是职责链模式、命令模式、解释器模式、迭代器模式、中介者模式、备忘录模式、观察者模式、状态模式、策略模式、模板方法模式和访问者模式。
本书将结合大量应用实例来分析和讲解每一个设计模式,力求通过最通俗易懂的方式来让读者学习和理解设计模式,并在真实项目实例的引导下学会合理选择和运用设计模式。每章的基本结构如下图所示。
每章的基本内容如下。
第1章: 介绍设计模式的基本概念;
第2章: 介绍UML类图与面向对象设计原则;
第3章: 介绍如何确保系统中一个类只能有一个实例;
第4章: 介绍如何将对象的创建和对象的使用分离;
第5章: 介绍如何通过不同的工厂来创建不同类型的对象;
第6章: 介绍如何设计一个能够创建一系列产品对象的工厂;
第7章: 介绍如何通过克隆来得到一个一模一样的对象;
第8章: 介绍如何一步步创建一个包含多个组成部分的复杂对象;
第9章: 介绍如何在不修改现有系统的前提下重用没有源码的第三方类库;
第10章: 介绍如何避免在多层继承结构中类的个数出现爆炸式增长;
第11章: 介绍如何使用面向对象的方式来处理软件系统中的树状结构;
第12章: 介绍如何不通过继承的方式来扩展类的功能;
第13章: 介绍如何为复杂子系统提供一个统一的入口;
第14章: 介绍如何实现对象的多次复用以节省系统资源;
第15章: 介绍如何提供一种间接访问机制来实现对象的远程访问或受限访问;
第16章: 介绍如何让多个对象都有机会来处理同一个请求;
第17章: 介绍如何将请求的发送者和请求接收者完全解耦;
第18章: 介绍如何自定义一个简单的语言;
第19章: 介绍如何间接遍历一个聚合对象中的元素;
第20章: 介绍如何协调多个对象之间复杂的相互调用;
第21章: 介绍如何在软件中实现撤销功能;
第22章: 介绍如何实现对象之间一对多的联动;
第23章: 介绍如何设计和实现一个具有多个状态的对象;
第24章: 介绍如何在不修改现有代码的前提下更换一种算法;
第25章: 介绍如何为一个复杂算法的某些步骤提供多种实现方式;
第26章: 介绍如何操作一个包含多种类型对象的复杂结构。
本书特点
本书不是教材,但有教材的严谨性;
本书不是科普书,但有科普书的通俗性;
本书没有故事情节,却也不失趣味性。
本书主要特点如下:
(1) 提供大量真实项目实例,针对每一个设计模式至少提供了一个完整的实例,是一本基于实例驱动的设计模式实践指南,结合实例来学习设计模式,可以让读者学会在实际开发中运用设计模式,具体实例列表参见之后的“实例目录”。
(2) 内嵌了适量的思考题和练习题,所有练习题也都基于某个项目实例,让读者能够在学习的同时通过思考题和练习题来理解和进一步巩固所学知识。
(3) 提供相应的技术博客支持(CSDN博客,地址: http://blog.csdn.net/LoveLion/),为广大读者提供一个灵活的沟通和交流平台。
(4) 内容全面,语言通俗,讲解深入,难度适中,可满足不同层次读者的需求,每一个实例都提供了完整的可执行代码和结构图,所有结构图(类图)均严格按照UML 2.0标准绘制,代码均在JDK 1.7环境下通过测试且运行无误。
目标读者
如果你是一位有一定开发经验的一线软件开发人员,你想提升自己的软件设计与开发功力,希望设计并开发出可复用性和可维护性俱佳的面向对象软件,那么本书为你而写;
如果你是一位计算机或软件相关专业的教育工作者,你想在教授设计或编程类课程的同时让学生掌握一些面向对象设计技巧并将其应用于项目实践,那么本书为你而写;
如果你是一名刚接触面向对象编程的初学者,你想更好地理解面向对象思想并编写出高质量的程序代码,那么本书为你而写;
如果你是一位软件工程或者软件架构设计研究人员,你正从事或者准备从事面向对象软件设计等相关研究工作,那么本书也为你而写。
无论你使用的编程语言是C++、Java、C#、VB.NET、ObjectiveC,还是JavaScript、PHP、Delphi、Python等,我相信本书都会有你想要的内容。
本书适用于:
从未接触过设计模式,想用较短的时间来熟悉并掌握设计模式的读者;
学习过设计模式,有一定基础,但不知道如何在实际开发中运用设计模式的读者;
使用过设计模式,想对GoF设计模式有一个更加全面的学习的读者;
……
总之,本书可作为一线软件开发人员、高等院校计算机及软件等相关专业师生、IT培训机构讲师和学员、业余软件开发人员及设计模式研究人员和爱好者的技术类参考用书和自学读物。
感谢
感谢我的师长,没有你们多年的悉心教诲与耐心指导,就没有现在的我。
感谢我的家人,谢谢你们一直在我背后的默默支持与真情付出。
感谢胡志刚、王斌、郭克华、张友生、费洪晓、任胜兵、谭长庚、
江林、徐再德、张佳宁、阎朝坤、张楚才、杨柳、宋铁、郑美光、任波、周建军、曾文兵、陈昌主等同事与好友在我写作过程中给予的宝贵意见和建议,正因为有你们,我的奋斗之路才会如此丰富多彩!
感谢黄瑞、屈光辉、胡坤、吕丰、梁佳宾、游永彬、刘宏韬、黄宇健、朱礼礼、李辉、唐磊、马元文等学生参与本书初稿的校对工作,并发现书中的一些文字纰漏和错误,从学习者的角度提出一些建议,以助于本书的充实和完善。
感谢我的CSDN技术博客中那些认识的、不认识的网友们对我工作的肯定,谢谢你们的支持与鼓励。
感谢所有帮助和支持过我的朋友,特别是那些听过我课的学生和企业学员。同时,在本书的编写过程中我参考和引用了国内外很多书籍和网站的相关内容,个别实例的初始原型也来源于网络,由于涉及的网站和网页太多,无法一一列举,在此一并予以感谢。
感谢武侠巨匠金庸老先生,那些武侠小说给予我太多写作灵感,同时书中不少实例中的人名也源于小说中那些经典的武侠人物。
最后特别感谢清华大学出版社为本书出版所付出的努力,你们的专业和严格的工作作风让我在写作过程中充满了激情与动力,因为我们的目标一致: 为读者送上最好的图书!
由于时间仓促、学识有限,虽经多次审阅与校稿,但书中不足和疏漏之处难免,恳请广大读者将意见和建议通过清华大学出版社反馈给我,力求精益求精,更趋完美。
刘伟2012年7月
本书所采用的讲解实例和练习实例如下表所示:
设计模式名称讲 解 实 例练 习 实 例
创建型模式
单例模式Windows任务管理器、负载均衡器数据库连接池
简单工厂模式图表库几何图形绘图工具
工厂方法模式日志记录器图片读取器
抽象工厂模式界面皮肤库手机游戏软件
原型模式OA系统工作周报、OA系统公文管理器销售管理系统中的客户类
建造者模式RPG网络游戏中的游戏角色视频播放软件
结构型模式
适配器模式教务管理系统与算法库重用OA系统加密模块
桥接模式跨平台图像浏览系统数据转换工具
组合模式杀毒软件界面控件库
装饰模式图形界面构件库、OA系统文档处理数据加密模块
外观模式文件加密模块智能手机控制与管理软件一键备份功能
享元模式围棋软件多功能文档编辑器
代理模式收费商务信息查询系统、OA系统方法调用日志网络图片查看器
行为型模式
职责链模式SCM系统之采购审批子系统OA系统假条审批模块
命令模式自定义功能键、简易计算器、网站配置文件管理工具公告板系统
解释器模式机器人控制程序、基于字符界面的格式化指令数据库同步指令
迭代器模式销售管理系统数据遍历教务管理系统学生信息遍历、逐页迭代器
中介者模式CRM系统客户信息管理窗口图形界面类库
备忘录模式中国象棋软件RPG网游
观察者模式多人联机对战游戏自定义登录组件、实时在线股票软件
状态模式信用卡业务系统、屏幕放大镜工具纸牌游戏软件
策略模式影院售票系统飞机模拟系统
模板方法模式银行业务支撑系统利息计算模块、销售管理系统数据图表显示功能数据库操作模块
访问者模式OA系统员工数据汇总奖励审批系统
