编辑推荐
详细讲解7个面向对象设计原则和24个常用设计模式
学练结合,包含超过150道习题和3套设计模式模拟试题
内容简介
本书使用C#语言详细讲解了24种设计模式。全书共分为26章,内容包括设计模式概述、面向对象设计原则、简单工厂模式、工厂方法模式、抽象工厂模式、建造者模式、原型模式、单例模式、适配器模式、桥接模式、组合模式、装饰模式、外观模式、享元模式、代理模式、职责链模式、命令模式、解释器模式、迭代器模式、中介者模式、备忘录模式、观察者模式、状态模式、策略模式、模板方法模式和访问者模式。
本书结合大量项目应用实例,对每一个设计模式都进行了细致的讲解。本书结构合理、条理清晰、内容丰富,且在每一章后面都配有大量的习题,在附录中还提供了对UML类图相关知识的介绍和三套设计模式模拟试题。
本书既可作为高等院校计算机及软件相关专业本科生和研究生软件设计模式、软件体系结构、面向对象分析与设计等课程教材,也可作为各软件培训机构培训教材及全国计算机技术与软件专业技术资格(水平)考试辅导教材,还可作为软件架构师、软件工程师及广大软件爱好者的自学读本和参考用书。
目录
目录
第1章设计模式概述
1.1设计模式的诞生与发展
1.1.1模式的诞生与定义
1.1.2软件模式概述
1.1.3设计模式的发展
1.2设计模式的定义与分类
1.2.1设计模式的定义
1.2.2设计模式的基本要素
1.2.3设计模式的分类
1.3GoF设计模式简介
1.4设计模式的优点
1.5本章小结
1.6习题
第2章面向对象设计原则
2.1面向对象设计原则概述
2.2单一职责原则
2.3开闭原则
2.4里氏代换原则
2.5依赖倒转原则
2.6接口隔离原则
2.7合成复用原则
2.8迪米特法则
2.9本章小结
2.10习题
第3章简单工厂模式
3.1创建型模式
3.2简单工厂模式概述
3.3简单工厂模式的结构与实现
3.3.1简单工厂模式的结构
3.3.2简单工厂模式的实现
3.4简单工厂模式的应用实例
3.5创建对象与使用对象
3.6简单工厂模式的简化
3.7简单工厂模式的优缺点与适用环境
3.7.1简单工厂模式的优点
3.7.2简单工厂模式的缺点
3.7.3简单工厂模式的适用环境
3.8本章小结
3.9习题
第4章工厂方法模式
4.1工厂方法模式概述
4.2工厂方法模式的结构与实现
4.2.1工厂方法模式的结构
4.2.2工厂方法模式的实现
4.3工厂方法模式的应用实例
4.4配置文件与反射
4.5工厂方法的重载
4.6工厂方法的隐藏
4.7工厂方法模式的优缺点与适用环境
4.7.1工厂方法模式的优点
4.7.2工厂方法模式的缺点
4.7.3工厂方法模式的适用环境
4.8本章小结
4.9习题
第5章抽象工厂模式
5.1产品等级结构与产品族
5.2抽象工厂模式概述
5.3抽象工厂模式的结构与实现
5.3.1抽象工厂模式的结构
5.3.2抽象工厂模式的实现
5.4抽象工厂模式的应用实例
5.5开闭原则的倾斜性
5.6抽象工厂模式的优缺点与适用环境
5.6.1抽象工厂模式的优点
5.6.2抽象工厂模式的缺点
5.6.3抽象工厂模式的适用环境
5.7本章小结
5.8习题
第6章建造者模式
6.1建造者模式概述
6.2建造者模式的结构与实现
6.2.1建造者模式的结构
6.2.2建造者模式的实现
6.3建造者模式的应用实例
6.4指挥者类的深入讨论
6.5建造者模式的优缺点与适用环境
6.5.1建造者模式的优点
6.5.2建造者模式的缺点
6.5.3建造者模式的适用环境
6.6本章小结
6.7习题
第7章原型模式
7.1原型模式概述
7.2原型模式的结构与实现
7.2.1原型模式的结构
7.2.2浅克隆与深克隆
7.2.3原型模式的实现
7.3原型模式的应用实例
7.4原型管理器
7.5原型模式的优缺点与适用环境
7.5.1原型模式的优点
7.5.2原型模式的缺点
7.5.3原型模式的适用环境
7.6本章小结
7.7习题
第8章单例模式
8.1单例模式概述
8.2单例模式的结构与实现
8.2.1单例模式的结构
8.2.2单例模式的实现
8.3单例模式的应用实例
8.4饿汉式单例与懒汉式单例
8.5单例模式的优缺点与适用环境
8.5.1单例模式的优点
8.5.2单例模式的缺点
8.5.3单例模式的适用环境
8.6本章小结
8.7习题
第9章适配器模式
9.1结构型模式
9.2适配器模式概述
9.3适配器模式的结构与实现
9.3.1适配器模式的结构
9.3.2适配器模式的实现
9.4适配器模式的应用实例
9.5缺省适配器模式
9.6双向适配器
9.7适配器模式的优缺点与适用环境
9.7.1适配器模式的优点
9.7.2适配器模式的缺点
9.7.3适配器模式的适用环境
9.8本章小结
9.9习题
第10章桥接模式
10.1桥接模式概述
10.2桥接模式的结构与实现
10.2.1桥接模式的结构
10.2.2桥接模式的实现
10.3桥接模式的应用实例
10.4桥接模式与适配器模式联用
10.5桥接模式的优缺点与适用环境
10.5.1桥接模式的优点
10.5.2桥接模式的缺点
10.5.3桥接模式的适用环境
10.6本章小结
10.7习题
第11章组合模式
11.1组合模式概述
11.2组合模式的结构与实现
11.2.1组合模式的结构
11.2.2组合模式的实现
11.3组合模式的应用实例
11.4透明组合模式与安全组合模式
11.5组合模式的优缺点与适用环境
11.5.1组合模式的优点
11.5.2组合模式的缺点
11.5.3组合模式的适用环境
11.6本章小结
11.7习题
第12章装饰模式
12.1装饰模式概述
12.2装饰模式的结构与实现
12.2.1装饰模式的结构
12.2.2装饰模式的实现
12.3装饰模式的应用实例
12.4透明装饰模式与半透明装饰模式
12.5装饰模式的优缺点与适用环境
12.5.1装饰模式的优点
12.5.2装饰模式的缺点
12.5.3装饰模式的适用环境
12.6本章小结
12.7习题
第13章外观模式
13.1外观模式概述
13.2外观模式的结构与实现
13.2.1外观模式的结构
13.2.2外观模式的实现
13.3外观模式的应用实例
13.4抽象外观类
13.5外观模式的优缺点与适用环境
13.5.1外观模式的优点
13.5.2外观模式的缺点
13.5.3外观模式的适用环境
13.6本章小结
13.7习题
第14章享元模式
14.1享元模式概述
14.2享元模式的结构与实现
14.2.1享元模式的结构
14.2.2享元模式的实现
14.3享元模式的应用实例
14.4有外部状态的享元模式
14.5单纯享元模式和复合享元模式
14.6享元模式的优缺点与适用环境
14.6.1享元模式的优点
14.6.2享元模式的缺点
14.6.3享元模式的适用环境
14.7本章小结
14.8习题
第15章代理模式
15.1代理模式概述
15.2代理模式的结构与实现
15.2.1代理模式的结构
15.2.2代理模式的实现
15.3代理模式的应用实例
15.4远程代理
15.5虚拟代理
15.6缓冲代理
15.7代理模式的优缺点与适用环境
15.7.1代理模式的优点
15.7.2代理模式的缺点
15.7.3代理模式的适用环境
15.8本章小结
15.9习题
第16章职责链模式
16.1行为型模式
16.2职责链模式概述
16.3职责链模式的结构与实现
16.3.1职责链模式的结构
16.3.2职责链模式的实现
16.4职责链模式的应用实例
16.5纯与不纯的职责链模式
16.6职责链模式的优缺点与适用环境
16.6.1职责链模式的优点
16.6.2职责链模式的缺点
16.6.3职责链模式的适用环境
16.7本章小结
16.8习题
第17章命令模式
17.1命令模式概述
17.2命令模式的结构与实现
17.2.1命令模式的结构
17.2.2命令模式的实现
17.3命令模式的应用实例
17.4实现命令队列
17.5记录请求日志
17.6实现撤销操作
17.7宏命令
17.8命令模式的优缺点与适用环境
17.8.1命令模式的优点
17.8.2命令模式的缺点
17.8.3命令模式的适用环境
17.9本章小结
17.10习题
精彩书摘
第3章简单工厂模式
本章导学
创建型模式关注对象的创建过程,是一类最常见的设计模式,在软件开发中的应用非常广泛。创建型模式描述如何将对象的创建和使用分离,让用户在使用对象时无须关心对象的创建细节,从而降低系统的耦合度,让设计方案更易于修改和扩展。
简单工厂模式是最简单的设计模式之一,它虽然不属于GoF的23种设计模式,但是应用也较为频繁,同时它也是学习其他创建型模式的基础。在简单工厂模式中,只需要记住一个简单的参数即可获得所需的对象实例,它提供专门的核心工厂类来负责对象的创建,实现对象的创建和使用分离。
本章将对6种创建型模式进行简要的介绍,并通过实例来学习简单工厂模式,理解简单工厂模式的结构及特点,学习如何在实际软件项目开发中合理地使用简单工厂模式。
本章知识点
�r 创建型模式。
�r 简单工厂模式的定义。
�r 简单工厂模式的结构。
�r 简单工厂模式的实现。
�r 简单工厂模式的应用。
�r 简单工厂模式的优缺点。
�r 简单工厂模式的适用环境。
3.1创建型模式
软件系统在运行时,类将实例化成对象,并由这些对象协作完成各项业务功能。创建型模式(Creational Pattern)关注对象的创建过程,是一类最常用的设计模式,在软件开发中的应用非常广泛。创建型模式对类的实例化过程进行了抽象,能够将软件模块中对象的创建和对象的使用分离,对用户隐藏了类的实例创建细节。
创建型模式描述如何将对象的创建和使用分离,让用户在使用对象时无须关心对象的创建细节,从而降低系统的耦合度,让设计方案更易于修改和扩展。每一个创建型模式都通过采用不同的解决方案来回答3个问题: 创建什么(What),由谁创建(Who)和何时创建(When)。
在GoF设计模式中,包含5种创建型模式,通常将一种非GoF设计模式——简单工厂模式作为学习其他工厂模式的基础,这6种设计模式的名称、定义、学习难度和使用频率如表3��1所示。
《C设计模式(第二版)——高等学校设计模式课程系列教材》图书简介 前言 在软件开发领域,设计模式如同建筑领域的蓝图,是经过无数实践检验的、解决特定问题的通用方案。它们沉淀了优秀程序员的智慧和经验,能够帮助开发者写出更灵活、更易于维护、更具可扩展性的代码。然而,理论知识的学习往往需要与实际应用的结合,尤其是对于正处于理论学习阶段的高校学子而言。 《C设计模式(第二版)——高等学校设计模式课程系列教材》正是为了填补这一空白而生。本书并非简单地罗列设计模式的定义和 UML 图,而是深入剖析 C 语言特性如何支持设计模式的实现,并结合大量的实际项目案例,引导读者理解设计模式的“为什么”和“如何用”。我们力求通过本书,让读者不仅能够掌握设计模式的“形”,更能领悟其“神”,从而在未来的软件开发道路上,能够“信手拈来”,写出优雅而健壮的代码。 本书的第二版,在第一版的基础上,进行了全面的更新与优化。我们根据最新的 C 语言发展趋势和业界最佳实践,对部分章节进行了重写和补充,加入了更多贴近实际开发场景的示例,并优化了讲解的深度和广度,以期更好地满足教学需求和读者的学习兴趣。 本书特色与内容概览 本书的核心在于将 C 语言的特性与设计模式的思想紧密结合,通过具体的代码示例和深入的分析,让读者在理解设计模式的同时,也加深对 C 语言本身强大功能的认识。我们避免了生硬的理论堆砌,而是以问题驱动,从实际开发中遇到的挑战出发,引出相应的设计模式,并详细讲解其适用场景、优缺点以及在 C 中的具体实现。 第一部分:设计模式基础与 C 语言支撑 在正式进入各种设计模式之前,本书将首先为读者打下坚实的基础。 第一章:软件设计与模式的起源 本章将带领读者回顾软件设计的演进历程,理解为什么需要设计模式。 介绍软件设计的核心原则,如 SOLID 原则(单一职责、开闭、里氏替换、接口隔离、依赖倒置),并简要阐述它们与设计模式之间的内在联系。 从宏观角度理解模式在软件架构中的作用,为后续具体模式的学习奠定思想基础。 第二章:C 语言中的关键特性与设计模式 本章是本书的独特之处,着重讲解 C 语言中哪些特性为设计模式的实现提供了强大的支持。 委托(Delegates)与事件(Events):深入讲解委托和事件的原理,以及它们如何在 Observer Pattern(观察者模式)等场景中发挥关键作用。 匿名方法(Anonymous Methods)与 Lambda 表达式(Lambda Expressions):阐述这些现代 C 特性如何简化函数式编程风格,并与 Strategy Pattern(策略模式)、Command Pattern(命令模式)等结合使用。 泛型(Generics):讲解泛型的类型安全和代码复用优势,以及它们如何增强 Factory Method Pattern(工厂方法模式)、Abstract Factory Pattern(抽象工厂模式)等模式的灵活性。 LINQ(Language Integrated Query):探讨 LINQ 如何简化数据查询和操作,以及其在 Iterator Pattern(迭代器模式)和 Visitor Pattern(访问者模式)中的潜在应用。 接口(Interfaces)与抽象类(Abstract Classes):回顾接口和抽象类的基础概念,并强调它们在实现通用的设计模式(如 Template Method Pattern(模板方法模式))时的重要性。 Extension Methods(扩展方法):讲解扩展方法如何为现有类型添加新功能,以及它们在 Decorator Pattern(装饰器模式)等场景中的应用。 第二部分:创建型设计模式 创建型模式关注对象的创建过程,能够使系统在创建对象时更加灵活和独立。 第三章:单例模式(Singleton Pattern) 讲解单例模式的意图、动机和适用场景。 提供多种 C 实现方式,包括饿汉式、懒汉式,并重点讨论线程安全问题及解决方法(如使用 `lock` 关键字,双重检查锁定,`Lazy`)。 结合实际场景,如日志记录器、配置管理器、数据库连接池等,说明单例模式的应用。 第四章:工厂方法模式(Factory Method Pattern) 阐述工厂方法模式的结构和行为。 通过 C 代码示例,展示如何使用抽象类或接口定义工厂,并让子类决定实例化哪个对象。 讲解其与依赖倒置原则的关系,以及在需要解耦产品类和创建逻辑时的优势。 第五章:抽象工厂模式(Abstract Factory Pattern) 讲解抽象工厂模式的意图和适用场景,强调其创建一系列相关或依赖对象的家族。 展示如何用 C 实现抽象工厂,以及如何处理不同产品系列的切换。 通过 GUI 工具包或数据库访问层等案例,说明其在跨平台或不同实现之间的抽象。 第六章:建造者模式(Builder Pattern) 介绍建造者模式的动机,即分离复杂对象的构造与其表示,使得相同的构造过程可以创建不同的表示。 通过构建复杂对象(如邮件、SQL 查询语句)的示例,演示建造者模式的实现。 强调其在对象参数过多或构造步骤复杂的场景中的应用。 第七章:原型模式(Prototype Pattern) 讲解原型模式的原理,即通过复制现有对象来创建新对象。 演示 C 中浅复制(`MemberwiseClone()`)和深复制(实现 `ICloneable` 接口,手动复制)的区别和实现。 说明其在需要频繁创建相似对象,并且对象创建成本较高时的优势。 第三部分:结构型设计模式 结构型模式关注类与对象之间的组合,以获得更大的灵活性和复用性。 第八章:适配器模式(Adapter Pattern) 讲解适配器模式的意图,即让原本不兼容的接口能够一起工作。 演示类适配器(继承)和对象适配器(组合)在 C 中的实现。 通过连接不同数据源格式、兼容旧系统接口等场景,展示其价值。 第九章:桥接模式(Bridge Pattern) 介绍桥接模式的动机,即分离抽象与实现,使它们可以独立变化。 通过一个例子,如不同数据库的查询接口,演示如何用 C 实现桥接模式,将抽象操作与其具体实现解耦。 强调其在系统规模庞大,功能多变,且需要避免类爆炸时的作用。 第十章:组合模式(Composite Pattern) 讲解组合模式的意图,即以树形结构组织对象,使它们可以被视为单个对象来处理。 通过文件系统、菜单结构、组织架构等示例,展示如何用 C 实现透明组合和安全组合。 说明其在处理层级结构数据时的便利性。 第十一章:装饰器模式(Decorator Pattern) 介绍装饰器模式的意图,即动态地给一个对象添加一些额外的职责。 通过给一个文本阅读器添加滚动条、添加加密功能等示例,讲解如何在 C 中实现装饰器。 强调其在不改变原类的前提下,增加功能,并且可以动态组合的优点。 第十二章:外观模式(Facade Pattern) 讲解外观模式的意图,即提供一个统一的接口,用来隐藏子系统中的一组接口。 通过一个简化的支付系统或多层业务逻辑的入口,展示如何用 C 实现外观模式。 说明其在简化复杂子系统调用,提高易用性方面的作用。 第十三章:享元模式(Flyweight Pattern) 介绍享元模式的意图,即通过共享来高效地支持大量细粒度对象。 通过一个简单的文本编辑器,演示如何共享字符对象,以减少内存消耗。 讲解其在处理大量相似对象,且对象的状态可以分离为内部状态和外部状态时的应用。 第十四章:代理模式(Proxy Pattern) 讲解代理模式的意图,即为其他对象提供一种代理,以控制对该对象的访问。 演示远程代理、虚拟代理、保护代理等在 C 中的实现。 结合日志记录、访问控制、懒加载等实际场景,阐述其应用。 第四部分:行为型设计模式 行为型模式关注对象之间的通信和职责的分配。 第十五章:责任链模式(Chain of Responsibility Pattern) 介绍责任链模式的意图,即避免请求的发送者与接收者耦合,使得多个对象都有机会处理请求。 通过请假审批、日志处理等流程,展示如何用 C 实现责任链。 说明其在处理一系列可能但又互不依赖的处理程序时的优势。 第十六章:命令模式(Command Pattern) 讲解命令模式的意图,即封装请求为一个对象,从而使你可用不同的请求对客户进行参数化,对请求排队或记录请求日志,以及支持可撤销的操作。 通过一个简单的图形编辑器或撤销/重做功能,演示命令模式的实现。 强调其在实现“命令”对象、解耦发送者和接收者方面的作用。 第十七章:迭代器模式(Iterator Pattern) 介绍迭代器模式的意图,即提供一种方法顺序访问一个聚合对象中的各个元素,而又不暴露其内部表示。 讲解 C 中内置的 `IEnumerable` 和 `IEnumerator` 接口,以及如何实现自定义迭代器。 说明其在遍历复杂数据结构时的重要性。 第十八章:中介者模式(Mediator Pattern) 讲解中介者模式的意图,即定义一个中介对象来封装一系列对象交互。 通过一个聊天室、飞机控制塔等场景,展示如何用 C 实现中介者模式,减少对象间的直接依赖。 强调其在梳理对象间复杂交互,降低耦合度的作用。 第十九章:备忘录模式(Memento Pattern) 介绍备忘录模式的意图,即在不破坏封装性的前提下,捕获一个对象的内部状态,并在之后恢复该状态。 通过实现一个简单的文本编辑器或游戏存档功能,演示备忘录模式的实现。 说明其在需要支持“撤销”或“恢复”功能时的应用。 第二十章:观察者模式(Observer Pattern) 讲解观察者模式的意图,即定义对象间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。 通过天气监测站、股票价格更新等示例,展示如何在 C 中使用委托、事件和 `INotifyPropertyChanged` 接口来实现观察者模式。 强调其在实现事件驱动和松耦合通信中的作用。 第二十一章:状态模式(State Pattern) 介绍状态模式的意图,即允许一个对象在其内部状态改变时改变它的行为,对象看起来似乎改变了它的类。 通过一个自动售货机、游戏角色状态等场景,展示如何用 C 实现状态模式。 说明其在处理对象状态繁多且行为随状态变化的场景中的优势。 第二十二章:策略模式(Strategy Pattern) 讲解策略模式的意图,即定义一系列算法,把它们封装起来,并使它们可以相互替换。 通过一个排序算法选择、支付方式选择等示例,展示如何在 C 中使用接口和 Lambda 表达式实现策略模式。 强调其在算法可变性的场景中,提供灵活选择和替换的能力。 第二十三章:模板方法模式(Template Method Pattern) 介绍模板方法模式的意图,即在父类中定义一个算法的骨架,而将算法中的某些步骤延迟到子类中实现。 通过一个数据处理流程、文件导出等场景,展示如何在 C 中实现模板方法模式。 说明其在定义通用算法框架,并允许子类定制特定步骤的优势。 第二十四章:访问者模式(Visitor Pattern) 讲解访问者模式的意图,即表示一个作用于某对象结构中的各元素的操作,而又不过度在这些元素的类中定义该操作。 通过一个文件目录遍历并执行不同操作,或一个购物车计算总价等场景,展示如何在 C 中实现访问者模式。 说明其在需要对对象结构执行新操作,而又不想修改现有类时的应用。 第五部分:实际应用与进阶 第二十五章:设计模式在 C 项目中的实战应用 本章将前面学到的设计模式进行整合,通过一个完整的、贴近实际的 C 项目案例,展示如何综合运用多种设计模式来解决复杂的软件工程问题。 例如,构建一个简单的 Web 应用后端,其中可能涉及单例模式用于数据库连接,工厂模式用于服务创建,策略模式用于不同业务逻辑的处理,观察者模式用于消息通知等。 重点在于分析项目需求,如何选择合适的设计模式,以及模式之间的协同工作。 第二十六章:设计模式的误用与反模式 在学习如何运用设计模式的同时,了解设计模式的误用和反模式同样重要。 本章将探讨一些常见的关于设计模式的误解,以及滥用模式可能带来的负面影响。 例如,过度设计(Over-engineering),选择不适合的模式,或者将模式用于简单场景,导致代码复杂度增加。 第二十七章:未来的设计趋势与模式演进 简要探讨当前软件开发领域的设计趋势,如函数式编程、微服务架构等,以及这些趋势如何影响设计模式的应用和演进。 引导读者保持学习的热情,不断探索和适应新的技术和设计思想。 致读者 本书的编写旨在为读者提供一套系统、深入且实用的 C 设计模式学习指南。我们鼓励读者在阅读理论知识的同时,积极动手实践,通过编写和调试代码来加深理解。我们深信,掌握设计模式,将是您在软件开发道路上披荆斩棘的有力武器。希望本书能成为您在学习 C 设计模式过程中的良师益友。
本书还有一个我认为非常值得称赞的地方,那就是它不仅仅提供了设计模式的理论知识,还积极引导读者思考“模式之间的关系”。比如,在讲解“代理模式”和“装饰器模式”时,作者会详细对比它们在“意图”和“实现”上的异同,以及各自适用的场景。这种深入的比较和辨析,能够帮助读者建立起一个完整的模式知识体系,避免将相似的模式混淆,也能够更准确地选择最适合当前问题的模式。在我看来,这种“融会贯通”的学习方式,远比死记硬背一个个独立的模式要有效得多。