‌《设计模式:可复用面向对象软件的基础》

引言与目录

引言

欢迎来到设计模式的世界!无论你是刚刚踏入编程领域的新手,还是经验丰富的开发者,相信“设计模式”这个词对你来说并不陌生。那么,什么是设计模式?为什么我们需要它们?设计模式又能带来哪些好处呢?

什么是设计模式?

设计模式(Design Patterns)是一套被反复使用、经过分类编目的、代码设计经验的总结。简单来说,设计模式是解决特定问题的一系列最佳实践。它们提供了一个模板,使我们能够以一种优雅且高效的方式来解决重复出现的问题。

为什么要有设计模式?

在软件开发过程中,我们经常会遇到类似的问题。设计模式为我们提供了经过验证的解决方案,从而使我们不必每次都去“重新发明轮子”。设计模式帮助我们:

  1. 提高代码的可重用性:通过使用设计模式,我们可以将常见的解决方案提取出来,从而在不同项目中复用这些代码。
  2. 提高代码的可读性:设计模式提供了一种标准的命名和结构,使代码更容易被他人理解。
  3. 提高代码的可维护性:设计模式使代码结构更加清晰,从而更容易进行修改和扩展。
  4. 提高开发效率:通过使用设计模式,我们可以快速找到解决方案,避免不必要的试错过程。
设计模式的好处

使用设计模式带来的好处是多方面的:

  1. 解决常见问题:设计模式提供了针对常见问题的最佳实践,帮助开发者快速找到解决方案。
  2. 促进团队协作:使用标准化模式,团队成员更容易理解和协作,提高开发效率。
  3. 提升代码质量:设计模式使代码更具结构性和可维护性,从而提高整体代码质量。
  4. 易于扩展和修改:设计模式提供了灵活的设计方法,使系统更容易扩展和修改。
  5. 装逼(手动狗头🐶)日常编码中炫技装逼以及应对八股文面试

ps:若看不懂UML类图可参阅 《UML类图详解(全网最无敌详解版(自封的))》

目录

‌参考自书籍 《设计模式:可复用面向对象软件的基础》

  1. 创建型模式
  2. 结构型模式
  3. 行为型模式
创建型模式(Creational Patterns)

定义:创建型模式关注对象的创建过程,旨在使对象的创建变得更加灵活和可扩展。它们通过封装实例化过程,避免了在代码中直接使用类名,从而提高了代码的可维护性和可扩展性。

常见模式

  1. 单例模式(Singleton Pattern):确保一个类只有一个实例,并提供一个全局访问点。

    • 应用场景:配置管理、日志系统、数据库连接池等。
  2. 工厂方法模式(Factory Method Pattern):定义一个用于创建对象的接口,让子类决定实例化哪一个类。

    • 应用场景:需要根据具体情况创建不同对象的场景。
  3. 抽象工厂模式(Abstract Factory Pattern):提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。

    • 应用场景:跨平台的UI库、相关对象的创建。
  4. 建造者模式(Builder Pattern):将对象的构建过程与表示分离,使同样的构建过程可以创建不同的表示。

    • 应用场景:创建复杂对象,例如配置文件解析器、文档生成器等。
  5. 原型模式(Prototype Pattern):通过复制现有对象来创建新对象。

    • 应用场景:当创建新对象成本较高时,使用现有对象的副本进行快速创建。
结构型模式(Structural Patterns)

定义:结构型模式关注对象和类的组合方式,旨在通过灵活组合对象来获得更大的结构。它们通过增删对象的行为和属性,使系统变得更加灵活和高效。

常见模式

  1. 适配器模式(Adapter Pattern):将一个类的接口转换成客户期望的另一个接口,使原本不兼容的类可以一起工作。

    • 应用场景:兼容旧系统、新旧接口对接。
  2. 桥接模式(Bridge Pattern):将抽象部分与实现部分分离,使它们可以独立变化。

    • 应用场景:跨平台的图形界面、设备驱动程序。
  3. 组合模式(Composite Pattern):将对象组合成树形结构以表示“部分-整体”的层次结构,使客户可以统一处理单个对象和组合对象。

    • 应用场景:文件系统目录、GUI组件树。
  4. 装饰模式(Decorator Pattern):动态地给对象添加一些额外的职责,就像一层层装饰一样。

    • 应用场景:IO流操作、图形界面组件。
  5. 外观模式(Facade Pattern):为子系统中的一组接口提供一个一致的界面,使得子系统更容易使用。

    • 应用场景:复杂系统的简化接口。
  6. 享元模式(Flyweight Pattern):运用共享技术有效地支持大量细粒度的对象。

    • 应用场景:字符处理、图形应用。
  7. 代理模式(Proxy Pattern):为其他对象提供一种代理以控制对这个对象的访问。

    • 应用场景:远程代理、虚拟代理、保护代理。
行为型模式(Behavioral Patterns)

定义:行为型模式关注对象之间的交互和职责分配,旨在使这些交互更加灵活和高效。它们通过定义对象之间的通信方式,使系统的行为更具适应性和灵活性。

常见模式

  1. 责任链模式(Chain of Responsibility Pattern):将请求沿着处理者链传递,直到有一个处理者对其进行处理。

    • 应用场景:请求处理链、事件分发系统。
  2. 命令模式(Command Pattern):将请求封装成对象,以便使用不同的请求、队列或日志来参数化其他对象。

    • 应用场景:命令队列、撤销操作。
  3. 解释器模式(Interpreter Pattern):给定一个语言,定义它的文法表示,并定义一个解释器来处理这种语言中的句子。

    • 应用场景:编译器、规则引擎。
  4. 迭代器模式(Iterator Pattern):提供一种方法顺序访问一个聚合对象中的各个元素,而不暴露其内部的表示。

    • 应用场景:集合遍历、数据流处理。
  5. 中介者模式(Mediator Pattern):定义一个中介对象来封装一系列对象之间的交互,使对象不需要显式地相互引用。

    • 应用场景:聊天室、事件处理系统。
  6. 备忘录模式(Memento Pattern):在不破坏封装性的前提下,捕获并存储对象的内部状态,以便日后恢复。

    • 应用场景:撤销操作、状态恢复。
  7. 观察者模式(Observer Pattern):定义对象间的一对多依赖,当一个对象改变状态时,所有依赖它的对象都会收到通知并自动更新。

    • 应用场景:事件订阅、通知系统。
  8. 状态模式(State Pattern):允许对象在内部状态改变时改变它的行为。

    • 应用场景:状态机、游戏角色行为。
  9. 策略模式(Strategy Pattern):定义一系列算法,让它们可以互换使用。

    • 应用场景:排序算法、路径规划。
  10. 模板方法模式(Template Method Pattern):在一个方法中定义一个算法的骨架,而将一些步骤的实现延迟到子类中。

    • 应用场景:算法骨架、框架设计。
  11. 访问者模式(Visitor Pattern):将操作分离到访问者中,使操作与被操作对象结构分离。

    • 应用场景:对象结构遍历、操作分离。
结语

设计模式是软件设计中的宝贵工具,通过理解和应用这些模式,我们能够编写出更加优雅、灵活和可维护的代码。在接下来的系列博客中,我们将逐一探讨每一种设计模式的具体实现和应用场景,敬请期待!喜欢的话,一键三连哦~

基本信息 原书名: Design Patterns:Elements of Reusable Object-Oriented software 原出版社: Addison Wesley/Pearson 作者: (美)Erich Gamma, Richard Helm, Ralph Johnson, John Vlissides [作译者介绍] 译者: 李英军 马晓星 蔡敏 刘建中 丛书名: 计算机科学丛书 出版社:机械工业出版社 ISBN:7111075757 上架时间:2005-7-19 出版日期:2004 年9月 开本:16开 页码:254 版次:1-11 内容简介   本书结合设计实例从面向对象的设计中精选出23个设计模式,总结了面向对象设计中最有价值的经验,并且用简洁可复用的形式表达出来。本书分类描述了一组设计良好、表达清楚的软件设计模式,这些模式在实用环境下特别有用。本书适合大学计算机专业的学生、研究生及相关人员参考。       [strong][font color="#ff0000"]书评[/font][/strong][font color="#ff0000"]       “这本众人期待的确达到了预期的全部效果。该书云集了经过时间考验的可用设计。作者从多年的面向对象设计经验中精选了23个模式,这构成了该书的精华部份,每一个精益求精的优秀程序员都应拥有这本《设计模式》。”--larry o'brien, software development       “[设计模式]在实用环境下特别有用,因为它分类描述了一组设计良好,表达清楚的面向对象软件设计模式。整个设计模式领域还很新,本书的四位作者也许已占据了这个领域造诣最深的专家中的半数,因而他们定义模式的方法可以作为后来者的榜样。如果要知道怎样恰当定义和描述设计模式,我们应该可以从他们那儿获得启发”--steve billow, journal of object-oriented programming       “总的来讲,这本书表达了一种极有价值的东西。对软件设计领域有着独特的贡献,因为它捕获了面向对象设计的有价值的经验,并且用简洁可复用的形式表达出来。它将成为我在寻找面向对象设计思想过程中经常翻阅的一本书﹕这正是复用的真实含义所在,不是吗﹖”--sanjiv gossain, journal of object-oriented programming [/font] 目 录 序言 前言 读者指南 第1章 引言 1 1.1 什么是设计模式 2 1.2 smalltalk mvc中的设计模式 3 1.3 描述设计模式 4 1.4 设计模式的编目 5 1.5 组织编目 7 1.6 设计模式怎样解决设计问题 8 1.6.1 寻找合适的对象 8 1.6.2 决定对象的粒度 9 1.6.3 指定对象接口 9 1.6.4 描述对象的实现 10 1.6.5 运用复用机制 13 1.6.6 关联运行时刻和编译时刻的 结构 15 1.6.7 设计应支持变化 16 1.7 怎样选择设计模式 19 .1.8 怎样使用设计模式 20 第2章 实例研究:设计一个文档编 辑器 22 2.1 设计问题 23 2.2 文档结构 23 2.2.1 递归组合 24 2.2.2 图元 25 2.2.3 组合模式 27 2.3 格式化 27 2.3.1 封装格式化算法 27 2.3.2 compositor和composition 27 2.3.3 策略模式 29 2.4 修饰用户界面 29 2.4.1 透明围栏 29 2.4.2 monoglyph 30 2.4.3 decorator 模式 32 2.5 支持多种视感标准 32 2.5.1 对象创建的抽象 32 2.5.2 工厂类和产品类 33 2.5.3 abstract factory模式 35 2.6 支持多种窗口系统 35 2.6.1 我们是否可以使用abstract factory 模式 35 2.6.2 封装实现依赖关系 35 2.6.3 window和windowimp 37 2.6.4 bridge 模式 40 2.7 用户操作 40 2.7.1 封装一个请求 41 2.7.2 command 类及其子类 41 2.7.3 撤消和重做 42 2.7.4 命令历史记录 42 2.7.5 command 模式 44 2.8 拼写检查和断字处理 44 2.8.1 访问分散的信息 44 2.8.2 封装访问和遍历 45 2.8.3 iterator类及其子类 46 2.8.4 iterator模式 48 2.8.5 遍历和遍历过程中的动作 48 2.8.6 封装分析 48 2.8.7 visitor 类及其子类 51 2.8.8 visitor 模式 52 2.9 小结 53 第3章 创建型模式 54 3.1 abstract factory(抽象工厂)— 对象创建型模式 57 3.2 builder(生成器)—对象创建型 模式 63 3.3 factory method(工厂方法)— 对象创建型模式 70 3.4 prototype(原型)—对象创建型 模式 87 3.5 singleton(单件)—对象创建型 模式 84 3.6 创建型模式的讨论 89 第4章 结构型模式 91 4.1 adapter(适配器)—类对象结构型 模式 92 4.2 bridge(桥接)—对象结构型 模式 100 4.3 composite(组成)—对象结构型 模式 107 4.4 decorator(装饰)—对象结构型 模式 115 4.5 facade(外观)—对象结构型 模式 121 4.6 flyweight(享元)—对象结构型 模式 128 4.7 proxy(代理)—对象结构型 模式 137 4.8 结构型模式的讨论 144 4.8.1 adapter与bridge 144 4.8.2 composite、decorator与proxy 145 第5章 行为模式 147 5.1 chain of responsibil ity(职责链) —对象行为型模式 147 5.2 command(命令)—对象行为型 模式 154 5.3 interpreter(解释器)—类行为型 模式 162 5.4 iterator(迭代器)—对象行为型 模式 171 5.5 mediator(中介者)—对象行为型 模式 181 5.6 memento(备忘录)—对象行为型 模式 188 5.7 observer(观察者)—对象行为型 模式 194 5.8 state(状态)—对象行为型模式 201 5.9 strategy(策略)—对象行为型 模式 208 5.10 template method(模板方法) —类行为型模式 214 5.11 visitor(访问者)—对象行为型 模式 218 5.12 行为模式的讨论 228 5.12 1 封装变化 228 5.12.2 对象作为参数 228 5.12.3 通信应该被封装还是被分布 229 5.12.4 对发送者和接收者解耦 229 5.12.5 总结 231 第6章 结论 232 6.1 设计模式将带来什么 232 6.2 一套通用的设计词汇 232 6.3 书写文档和学习的辅助手段 232 6.4 现有方法的一种补充 233 6.5 重构的目标 233 6.6 本书简史 234 6.7 模式界 235 6.8 alexander 的模式语言 235 6.9 软件中的模式 236 6.10 邀请参与 237 6.11 临别感想 237 附录a 词汇表 238 附录b 图示符号指南 241 附录c 基本类 244 参考文献 249   前 言      本书并不是一本介绍面向对象技术或设计的书,目前已有不少好书介绍面向对象技术或设计。本书假设你至少已经比较熟悉一种面向对象编程语言,并且有一定的面向对象设计经验。当我们提及“类型”和“多态”,或“接口”继承与“实现”继承的关系时,你应该对这些概念了然于胸,而不必迫不及待地翻阅手头的字典。      另外,这也不是一篇高级专题技术论文,而是一本关于设计模式的书,它描述了在面向对象软件设计过程中针对特定问题的简洁而优雅的解决方案。设计模式捕获了随时间进化与发展的问题的求解方法,因此它们并不是人们从一开始就采用的设计方案。它们反映了不为人知的重新设计和重新编码的成果,而这些都来自软件开发者为了设计出灵活可复用软件而长时间进行的艰苦努力。设计模式捕获了这些解决方案,并用简洁易用的方式表达出来。      设计模式并不要求使用独特的语言特性,也不采用那些足以使你的朋友或老板大吃一惊的神奇的编程技巧。所有的模式均可以用标准的面向对象语言实现,这也许有时会比特殊的解法多费一些功夫,但是为了增加软件的灵活性和可复用性,多做些工作是值得的。      一旦你理解了设计模式并且有了一种“Aha!”(而不是“Huh?”)的应用经验和体验后,你将用一种非同寻常的方式思考面向对象设计。你将拥有一种深刻的洞察力,以帮助你设计出更加灵活的、模块化的、可复用的和易理解的软件—这也是你为何着迷于面向对象技术的源动力,不是吗?      当然还有一些提示和鼓励:第一次阅读此书时你可能不会完全理解它,但不必着急,我们在起初编写这本书时也没有完全理解它们!请记住,这不是一本读完一遍就可以束之高阁的书。我们希望你在软件设计过程中反复参阅此书,以获取设计灵感。      我们并不认为这组设计模式是完整的和一成不变的,它只是我们目前对设计的思考的记录。因此我们欢迎广大读者的批评与指正,无论从书中采用的实例、参考,还是我们遗漏的已知应用,或应该包含的设计模式等方面。你可以通过Addison-Wesley写信给我们,或发送电子邮件到:design-patterns@cs.uiuc.edu。你还可以发送邮件“send design pattern source”到design-patterns-source@cs.uiuc.edu获取书中的示例代码部分的源代码。      另外我们有一个专门的网页报道最新的消息与更新:      http://st-www.cs.uiuc.edu/users/patterns/DPBook/DPBook.html.      E.G. 于加州Mountain View    .  R.H. 于蒙特利尔      R.J. 于伊利诺Urbana      J.V. 于纽约 Hawthorne      1994年8月    序言    所有结构良好的面向对象软件体系结构中都包含了许多模式。实际上,当我评估一个面向对象系统的质量时,所使用的方法之一就是要判断系统的设计者是否强调了对象之间的公共协同关系。在系统开发阶段强调这种机制的优势在于,它能使所生成的系统体系结构更加精巧、简洁和易于理解,其程度远远超过了未使用模式的体系结构。    模式在构造复杂系统时的重要性早已在其他领域中被认可。特别地,Christopher Alexander和他的同事们可能最先将模式语言(pattern language)应用于城市建筑领域,他的思想和其他人的贡献已经根植于面向对象软件界。简而言之,软件领域中的设计模式为开发人员提供了一种使用专家设计经验的有效途径。    在本书中,Erich Gamma、Richard Helm、Ralph Johnson和John Vlissides介绍了设计模式的原理,并且对这些设计模式进行了分类描述。因此,该书做出了两个重要的贡献:首先,它展示了模式在建造复杂系统过程中所处的角色;其次,它为如何引用一组精心设计的模式提供了一个实用方法,以帮助实际开发者针对特定应用问题使用适当的模式进行设计。    我曾荣幸地有机会与本书的部分作者一同进行体系结构设计工作,从他们身上我学到了许多东西,并相信通过阅读该书你同样也会受益匪浅。    Rational 软件公司首席科学家 Grady Booch
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值