编辑推荐
《模式:工程化实现及扩展(设计模式C#版)》第一部分除了介绍面向对象设计原则外,还充实了一些C#语言的介绍,但这些内容并不是枯燥的讲解,读者可以在阅读中通过一系列动手练习尽快吸收这些理论并将它们内化为自己的技能。《模式:工程化实现及扩展(设计模式C#版)》最后一部分的“GOF综合练习”把各种设计模式做了一次集中展示,目的是让读者把分散的模式知识融合在一起,能够将书本知识真正用于改善一个“准”生产型模块的实现。
内容简介
设计模式不是一门适合空谈的技术,它来自于开发人员的工程实践又服务于工程实践。
《模式:工程化实现及扩展(设计模式C#版)》并不是一本面向入门者的读物,因为它需要结合工程实践介绍如何发现模式灵感、如何应用模式技术。不过作为一本介绍设计模式的书,它并不需要读者对于庞大的.NET Framework有深入了解,因为扩展主要是结合C#语法完成的,配合书中的实例,相信读者不仅能够熟练应用设计模式技术,也能令自己的C#语言上一个台阶。
为了降低学习门槛,本书第一部分除了介绍面向对象设计原则外,还充实了一些C#语言的介绍,但这些内容并不是枯燥的讲解,读者可以在阅读中通过一系列动手练习尽快吸收这些理论并将它们内化为自己的技能。本书最后一部分的“GOF综合练习”把各种设计模式做了一次集中展示,目的是让读者把分散的模式知识融合在一起,能够将书本知识真正用于改善一个“准”生产型模块的实现。
作者简介
王翔,软件架构师,主要从事.NET、XML、公钥基础设施的开发。专注于数据(尤其是XML信息)的生产、加工、交换、提炼等过程。最近参与了一系列有关应用密码技术和PKI环境保护信息系统数据安全的项目。最喜欢数学,平常案头总是摆一本数学练习题。闲暇时间喜欢写作,通过发表多种技术文章与国内外同行交流各种数据应用经验。项目间隙经常到各海滨城市徒步旅行、野外露营、出海航行、极限运动,这几年烹饪也渐渐成为个人主要爱好。
目录
第一篇 预备知识——发掘C#语言的面向对象设计潜力
第1章 面向对象设计原则
1.1 说明
1.2 单一职责原则(SRP)
1.3 里氏替换原则(LSP)和依赖倒置原则(DIP)
1.4 接口隔离原则(ISP)
1.5 迪米特法则(LoD:Law of Demeter、LKP)
1.6 开闭原则(OCP)
1.7 小结
1.8 自我检验
第2章 重新研读C#语言
2.1 说明
2.2 C# 部分语法内容扩展
2.2.1 命名空间(Namespace)
2.2.2 简洁的异步调用机制——委托(Delegate)和事件(Event)
2.2.3 考验算法的抽象能力——泛型(Generics)
2.2.4 用贴“标签”的方式扩展对象特性
2.2.5 可重载运算符(Overloadable Operators)与
转换运算符(Conversion Operators)
2.3 面向插件架构的配置系统设计
2.3.1 认识.NET Framework提供的主要配置实体类
2.3.2 小结
2.3.3 自我检验
2.4 依赖注入
2.4.1 背景介绍
2.4.2 示例情景
2.4.3 构造注入(Constructor)
2.4.4 设值注入(Setter)
2.4.5 接口注入
2.4.6 基于属性的注入方式(Attributer)
2.4.7 小结
2.4.8 自我检验
2.5 连贯接口(Fluent Interface)
第3章 Java和C#
3.1 说明
3.2 枚举(Enum)
3.3 泛型(Generics)
3.4 属性和标注(Attribute and Annotation)
3.5 操作符重载和类型转换重载
3.6 委托、事件、匿名方法
3.7 Lamada和LINQ
3.8 小结
第二篇 创建型模式——管理对象实例的构造过程
第4章 工厂&工厂方法模式
4.1 说明
4.2 简单工厂
4.2.1 最简单的工厂类
4.2.2 简单工厂的局限性
4.3 经典回顾
4.4 解耦工厂类型与客户程序
4.5 基于配置文件的工厂
4.5.1 基于配置文件解耦工厂接口和具体工厂类型
4.5.2 基于配置文件解耦工厂类型和具体工作产品
4.6 典型工程化实现
4.7 小结
4.8 自我检验
第5章 单件模式
5.1 说明
5.2 经典回顾
5.3 线程安全的单件模式
5.4 细节决定成败
5.5 细颗粒度的单件模式
5.5.1 背景讨论
5.5.2 解决桌面应用中细颗粒度单件模式问题
5.5.3 解决Web应用中细颗粒度单件模式问题
5.6 分布式环境下的单件模式
5.7 单件模式的使用问题
5.8 小结
第6章 抽象工厂模式
6.1 说明
6.2 经典回顾
6.3 解决经典模式的硬伤
6.4 基于委托的生产外包
6.5 小结
第7章 创建者模式
7.1 说明
7.2 经典回顾
7.3 为Builder打个标签
7.4 具有装配/卸载能力的Builder
7.5 连贯接口形式的Builder
7.6 小结
7.7 自我检验
第8章 原型模式
8.1 说明
8.2 经典回顾
8.3 表面模仿还是深入模仿
8.3.1 概念
8.3.2 制作实现克隆的工具类型
8.3.3 简单自定义复制过程
8.3.4 细颗粒度自定义复制过程
8.4 小结
8.5 自我检验
第三篇 结构型模式——组织灵活的对象体系
第9章 适配器模式
9.1 说明
9.2 经典回顾
9.3 类型转换符实现适配
9.4 组适配器
9.5 用配置约定适配过程
9.6 面向数据的适配机制
9.7 小结
9.8 自我检验
第10章 桥模式
10.1 说明
10.2 经典回顾
10.3 分解复杂性的多级桥关系
10.4 看着“图纸”造桥
10.5 具有约束关系的桥
10.6 小结
10.7 自我检验
第11章 组合模式
11.1 说明
11.2 经典回顾
11.3 用迭代器遍历组合类型
11.4 适于XML信息的组合模式
11.5 分布式“部分—整体”环境
11.6 小结
11.7 自我检验
第12章 装饰模式
12.1 说明
12.2 经典回顾
12.3 卸载装饰
12.4 通过配置和创建者完成装饰过程
12.5 把装饰类型做成标签
12.5.1 更“彻底”的属性注入
12.5.2 方式1:采用.NET平台自带的AOP机制实现
12.5.3 自定义代理拦截框架方式
12.5.4 进一步分析
12.6 小结
第13章 外观模式
13.1 说明
13.2 经典回顾
13.3 平台、开发语言无关的抽象Facade接口——WSDL
13.4 小结
第14章 享元模式
14.1 说明
14.2 经典回顾
14.3 制订共享计划
14.4 通过委托和队列实现异步享元
14.5 小结
第15章 代理模式
15.1 说明
15.2 经典回顾
15.3 远程代理
15.4 小结
第四篇 行为型模式——算法、控制流的对象化操作
第16章 职责链模式
16.1 说明
16.2 经典回顾
16.3 非链表方式定义职责链
16.4 小结
第17章 模板方法模式
17.1 说明
17.2 经典回顾
17.3 方法的模板——委托
17.4 类和接口的模板——泛型
17.5 系统架构的模板——配置
17.6 小结
17.7 自我检验
第18章 解释器模式
18.1 说明
18.2 经典回顾
18.3 采用正则表达式
18.4 采用字典 5
18.5 多级解释器系统
18.6 用XSD解释自定义业务语言
18.7 小结
18.8 自我检验
第19章 命令模式
19.1 说明
19.2 经典回顾
19.3 打包命令对象
19.4 异步命令操作
19.5 命令操作队列
19.6 小结
19.7 自我检验
第20章 迭代器模式
20.1 说明
20.2 经典回顾
20.3 .NET内置的迭代器
20.4 小结
20.5 自我检验
第21章 中介者模式
21.1 说明
21.2 经典回顾
21.3 基于委托和事件的松耦合中介者
21.4 根据配置动态协调通知关系
21.5 小结
21.6 自我检验
第22章 备忘录模式
22.1 说明
22.2 经典回顾
22.3 把备忘压栈
22.4 备忘录的序列化和持久化
22.4 小结
22.5 自我检验
第23章 观察者模式
23.1 说明
23.2 经典回顾
23.3 .NET内置的观察者机制——事件
23.4 具有观察者机制的集合类型
23.5 面向服务接口的观察者
23.6 小结
23.7 自我检验
第24章 状态模式
24.1 说明
24.2 经典回顾
24.3 状态的序列化和持久化
24.4 主动状态对象
24.5 用WF完成更易于编排的状态模式
24.6 小结
24.7 自我检验
第25章 策略模式
25.1 说明
25.2 经典回顾
25.3 策略模式与解释器模式的协作
25.4 .NET自带的策略接口
25.5 小结
第26章 访问者模式
26.1 说明
26.2 经典回顾
26.3 借助反射或Dynamic实现访问者
26.4 用委托实现工程化的访问者
26.5 小结
26.6 自我检验
第五篇 GOF综合练习
第27章 GOF部分阶段实践
27.1 回顾GOF
27.2 需求的提出
27.3 第一轮技术分析
27.4 第二轮技术分析
27.5 第三轮技术分析
27.6 示例实现
27.7 验证逻辑的有效性
27.8 小结
27.9 后记
附录 Java和C#关键字对照表
前言/序言
第一篇 预备知识―发掘C#语言的面向对象设计潜力
第1章 面向对象设计原则
1.1 说明
1.2 单一职责原则(SRP)
1.3 里氏替换原则(LSP)和依赖倒置原则(DIP)
1.4 接口隔离原则(ISP)
1.5 迪米特法则(Lo D :Law of Demeter、LKP)
1.6 开闭原则(OCP)
1.7 小结
1.8 自我检验
1.1 说明
在介绍模式内容之前,我们先谈一些有关面向对象的话题。
《模式—工程化实现及扩展》系列的各个分册,无论是设计模式还是架构模式,前面其实都应该加上“面向对象的”,即我们谈论的是面向对象的设计模式和面向对象的架构模式。
同其他软件领域一样,面向对象技术同样有一些传承下来的设计原则,它们是众多面向对象先驱们不断提炼总结出来的,这些原则甚至可以被称为是“规律性”的,因为随着项目规模的扩大,我们会不断体会到这些原则的重要性。对于开发人员来说,这些原则的重要性是在一遍遍“撞南墙”的过程中体会到的,是不断“费力”、“重写”之后慢慢体会到的。
这些原则同样体现在各类设计模式、架构模式之中,在学习过程中我们会通过类图、时序图、示例代码等形式不断体会这些原则解决“依赖”和“变化”的效果。当然,这些“原则”也在变化,不断有新的“原则”加入,也有在“大浪淘沙”中淘汰掉的,真正沉淀下来的通用“原则”其实并不多。总体来说,面向对象的典型原则可以划分为两类—“面向类”的和“面向包”的。
《模式:工程化实现及扩展(设计模式C版)》书籍简介 这是一本深度剖析设计模式在 C 工程化应用的书籍,它不仅仅是理论的堆砌,更是将抽象的设计原则转化为具体、可落地、可维护的代码实践。本书旨在帮助开发者 在实际项目开发中, 有效 地 运用设计模式, 提升 代码的 可读性、 可扩展性、 可重用性 和 可维护性, 从而 构建更健壮、更灵活的软件系统。 本书内容 聚焦 于 如何将设计模式 从 概念 层面 转化为 实际的 C 代码实现。 我们 深入 探讨 每一个 核心设计模式的 起源、 解决的问题、 应用场景, 以及 如何在 C 语言的特性下进行最优的 工程化 落地。 不同于 市面上 许多 仅停留在 简单示例 讲解的 书籍, 本书 强调 “工程化” 的 维度, 意味着 我们 会 关注 模式在 大型项目、 团队协作、 长期演进 中的 实际 价值和 注意事项。 我们 将 首先 从 设计模式的 基石 —— SOLID 原则 开始, 系统地 梳理 其 内涵 和 在 C 中的 具体体现。 理解 SOLID 原则 是 掌握 设计模式的 关键, 因为 几乎 所有 优秀的设计模式 都 是 SOLID 原则 的 具象化 实践。 我们将 通过 大量的 代码示例, 展示 如何 在 C 中 践行 单一职责、 开放封闭、 里氏替换、 接口隔离 和 依赖倒置 原则, 并 以此为 基础, 为 后续 的 模式学习 打下 坚实 的 基础。 随后, 本书 将 系统性地 介绍 创建型模式(Creational Patterns)。 我们 会 深入 讲解 单例模式(Singleton)、 工厂方法模式(Factory Method)、 抽象工厂模式(Abstract Factory)、 建造者模式(Builder) 和 原型模式(Prototype)。 对于 每一种 模式, 我们 都 将 详细 阐述 其 设计思路, 分析 它 如何 解决了 对象的 创建 过程中的 复杂性 和 耦合性。 在 C 的 语境下, 我们会 探讨 如何在 多线程环境 下 实现 线程安全的 单例; 如何 利用 泛型 和 接口 构建 灵活的 工厂; 如何 通过 建造者模式 分离 对象的 构建 过程 和 其 表示; 以及 如何 利用 原型模式 实现 高效的 对象复制。 本书 特别 注重 这些 模式的 工程化 考量, 例如 单例的 懒加载 和 初始化时机, 工厂模式 的 命名规范 和 可维护性, 以及 建造者模式 在 复杂对象 配置 场景下的 应用。 接着, 我们将 进入 结构型模式(Structural Patterns) 的学习。 我们会 详细 解析 适配器模式(Adapter)、 桥接模式(Bridge)、 组合模式(Composite)、 装饰器模式(Decorator)、 外观模式(Facade)、 享元模式(Flyweight) 和 代理模式(Proxy)。 这些 模式 主要 关注 对象的 组合 和 协作, 以 实现 更 好的 灵活性 和 复用性。 在 C 中, 我们 会 探讨 如何 使用 适配器模式 连接 不兼容的 接口; 如何 运用 桥接模式 将 抽象 和 实现 分离; 如何 通过 组合模式 处理 树形结构 的数据; 如何 利用 装饰器模式 动态 地 给 对象 添加 新的 职责; 如何 通过 外观模式 简化 复杂的 子系统; 如何 运用 享元模式 减少 对象的 创建 数量, 提高 内存利用率; 以及 如何 通过 代理模式 控制 对 其他 对象的 访问。 本书 会 在 这些 模式的 应用中, 强调 C 的 特性, 如 扩展方法、 委托 和 LINQ 如何 为 模式的 实现 带来 更 简洁 和 优雅 的 方式。 之后, 我们将 深入 行为型模式(Behavioral Patterns)。 这部分 内容 包括 责任链模式(Chain of Responsibility)、 命令模式(Command)、 解释器模式(Interpreter)、 迭代器模式(Iterator)、 中介者模式(Mediator)、 备忘录模式(Memento)、 观察者模式(Observer)、 状态模式(State)、 策略模式(Strategy)、 模板方法模式(Template Method) 和 访问者模式(Visitor)。 行为型模式 关注 对象之间的 算法 和 职责的 划分。 我们 会 详细 讲解 每一种 模式的 工作原理, 以及 在 C 中 如何 将其 应用于 实际场景。 例如, 如何 利用 责任链模式 实现 事件处理 的 分发; 如何 通过 命令模式 封装 操作 并 支持 撤销 和 重做; 如何 运用 迭代器模式 遍历 各种 集合; 如何 通过 中介者模式 降低 对象间的 直接耦合; 如何 利用 备忘录模式 保存 对象的 内部状态; 如何 通过 观察者模式 实现 对象间的 一对多 依赖关系; 如何 运用 状态模式 使 对象 在其 内部状态 改变时 改变 其 行为; 如何 通过 策略模式 封装 可互换的 算法; 如何 运用 模板方法模式 定义 算法的 骨架 并 允许 子类 重定义 某些 步骤; 以及 如何 通过 访问者模式 在 不修改 对象 结构 的前提下 增加 新的 操作。 在 C 的 实现 中, 我们将 特别 关注 委托、 事件、 泛型 和 匿名方法 等 语言特性 如何 使 这些 模式的 代码 更加 简洁 和 高效。 本书的 核心 竞争力 在于其 “工程化实现及扩展” 的 定位。 我们 不仅 会 提供 模式的 标准实现, 更会 深入 探讨 以下 关键的 工程化 议题: 模式的选择与权衡: 并非所有场景都适合应用某个模式,本书将指导读者如何在项目需求、团队熟悉度、性能影响等多个维度进行权衡,选择最合适的模式。 模式的组合与扩展: 在实际项目中,常常需要将多个模式组合使用,或者对现有模式进行适当的扩展以满足特定需求。本书将通过实例展示如何进行模式的组合与灵活扩展。 模式的误用与陷阱: 设计模式是解决问题的工具,但如果滥用或误用,反而会增加系统的复杂性,甚至引入新的问题。本书将剖析常见的模式误用场景,帮助读者规避潜在的风险。 模式在 C .NET 生态中的应用: 结合 C 和 .NET 框架的特性,如 LINQ、async/await、委托、事件、泛型等,展示如何用更 idiomatic 的方式实现设计模式,并探讨这些特性如何辅助模式的应用。 测试驱动开发(TDD)与设计模式: 如何在 TDD 的流程中自然地引入和应用设计模式,以保证代码的可测试性和设计质量。 重构与设计模式: 当现有代码不符合设计原则或模式时,如何通过重构将其转化为更优的设计。 本书 采用 大量的 真实项目 案例 和 精炼的代码 示例, 力求 将 抽象的设计模式 转化为 开发者 触手可及 的 实际 编码技巧。 我们 相信, 通过 本书 的学习, 读者 将 不再 将 设计模式 视为 晦涩难懂 的 理论, 而是 将其 视为 强大的 工具, 能够 游刃有余 地 应用于 软件开发 的 各个 环节, 从而 构建出 高质量、 高效率、 易于维护 的 软件产品。 无论 您是 刚踏入 软件开发 领域的 新手, 还是 经验丰富的 资深开发者, 本书 都 将 为您 带来 深刻的 启迪 和 实用的 价值。
说实话,我曾经对“设计模式”这个概念有些抵触,觉得它们太学院派,太理论化,和我们日常的“搬砖”式开发相去甚远。但《模式:工程化实现及扩展(设计模式C版)》这本书,彻底改变了我的看法。这本书的切入点非常独特,它不像其他很多书籍那样直接抛出模式名称,而是从软件设计中普遍存在的问题出发,比如代码的耦合性太高、难以扩展、维护成本过大等等。然后,它巧妙地引出设计模式,告诉你这些模式是如何自然而然地演化而来,用来解决这些具体痛点的。这种“问题导向”的讲解方式,让我瞬间就产生了共鸣,感觉作者就像是在和我一起探讨那些我一直以来遇到的难题。书中对“观察者模式”的讲解,就非常生动。它不是枯燥地解释事件订阅和发布,而是通过一个生动的案例,比如一个实时股票交易系统,展示了如何在多个组件之间建立松散的耦合,让它们能够相互通信,而无需直接依赖。而且,书中提供的C代码,不仅清晰易懂,而且非常注重代码的质量和可维护性,包含了大量的注释和最佳实践,读完之后,我感觉自己的代码风格都得到了潜移默化的提升。这本书让我认识到,设计模式不是束缚,而是解放,是提高开发效率和代码质量的利器。它让我开始思考如何写出更具“生命力”的代码,能够随着业务的发展而不断成长。