【进阶编程】软件23种设计模式

前言:

23 种设计模式最早由Erich GammaRichard HelmRalph JohnsonJohn Vlissides四位作者提出,他们被称为“Gang of Four (GoF)”,即“四人帮”。他们在1994年出版的经典书籍《设计模式:可复用面向对象软件的基础》(Design Patterns: Elements of Reusable Object-Oriented Software) 中总结并提出了这些设计模式。这本书是软件工程领域的里程碑式著作,为面向对象软件设计奠定了基础。

它们被分为三大类:创建型模式结构型模式行为型模式

创建型模式 (Creational Patterns)

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

  •  示例: 一个数据库连接池类,它保证系统中只有一个连接池实例来管理所有数据库连接。
  • 场景: 在整个应用程序中只需要一个共享资源实例,如配置文件读取、日志记录等。

2. 工厂方法模式 (Factory Method):定义一个创建对象的接口,让子类决定实例化哪一个类。

  • 示例: 一个应用程序需要创建不同类型的文档(如Word文档、PDF文档),可以使用工厂方法模式来定义一个接口,并让子类决定实例化哪种文档。
  • 场景: 当一个类无法预见它需要创建的对象类型时,使用工厂方法模式来将对象的创建延迟到子类。

3. 抽象工厂模式 (Abstract Factory):提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们的具体类。

  • 示例: 一个跨平台的GUI库,需要在不同操作系统上生成不同的控件(如按钮、窗口)。抽象工厂模式可以创建一个工厂类,根据操作系统的不同生成相应的控件。
  • 场景: 当一个系统需要独立于其产品的创建过程来工作时,适合使用抽象工厂模式。

4. 建造者模式 (Builder):将一个复杂对象的构建过程与其表示分离,使得同样的构建过程可以创建不同的表示。

  • 示例: 一个用于创建复杂对象(如汽车)的类,其中汽车由引擎、车轮、座椅等多个部分组成。建造者模式可以让构建这些部分的过程独立于它们的表示。
  • 场景: 适用于创建由多个部分构成的复杂对象,且其构建过程可能会有所不同的场景。

5. 原型模式 (Prototype):通过复制现有对象来创建新对象,而不是通过实例化。

  • 示例: 游戏开发中,当需要创建多个相似的敌人对象时,可以通过克隆一个原型敌人对象来快速生成多个敌人。
  • 场景: 当系统需要避免高代价的对象创建操作时,原型模式提供了一种基于现有对象快速创建新对象的方法。

 结构型模式 (Structural Patterns)

6. 适配器模式 (Adapter):将一个类的接口转换成客户希望的另一个接口,使得原本由于接口不兼容而不能一起工作的类可以协同工作。

  • 示例: 在一个现有的绘图系统中引入新的绘图接口(如SVG绘图),可以通过适配器将新接口适配到旧系统中。
  • 场景: 适用于接口不兼容但需要合作的类,如在旧系统中引入新功能时。

7. 桥接模式 (Bridge):将抽象部分与它的实现部分分离,使它们可以独立地变化。

  • 示例: 一个跨平台的图形应用程序,通过桥接模式将图形的抽象部分与具体的实现(如OpenGL、DirectX)分离,支持不同的图形库。
  • 场景: 当一个对象具有多个维度的变化时(如图形的形状与颜色),桥接模式允许这两者独立变化。

8. 组合模式 (Composite):将对象组合成树形结构以表示“部分-整体”的层次结构。组合模式使得客户可以对单个对象和组合对象保持一致的方式处理。

  • 示例: 一个文件系统,文件和文件夹可以看作是树形结构中的叶节点和分支节点,组合模式允许对文件和文件夹的操作统一处理。
  • 场景: 适用于表示对象的部分-整体层次结构,并希望用户能以统一的方式处理个别对象和组合对象的场景。

9. 装饰器模式 (Decorator):动态地给一个对象添加一些额外的职责。就扩展功能而言,装饰器模式比生成子类更为灵活。

  • 示例: 一个图形编辑器中,文本框可以增加滚动条、边框等装饰,装饰器模式允许在不修改原有类的情况下动态地添加这些功能。
  • 场景: 当希望在不改变类结构的情况下增强对象的功能时,装饰器模式是一个灵活的解决方案。

10. 外观模式 (Facade):为子系统中的一组接口提供一个一致的界面,定义一个高层接口,这个接口使得这一子系统更加容易使用。

  • 示例: 一个复杂的图形处理库,用户只需通过外观模式提供的简单接口(如“RenderImage”)来使用,而不必了解其内部复杂的实现细节。
  • 场景: 当一个子系统很复杂且难以使用时,外观模式通过提供一个简化的接口来降低系统的复杂性。

11. 享元模式 (Flyweight):运用共享技术有效地支持大量细粒度的对象。

  • 示例: 在一个文字处理软件中,同样的字符对象可以重复使用,以节省内存。享元模式通过共享对象来减少内存开销。
  • 场景: 当一个应用程序需要大量相似对象时,通过共享减少内存消耗和提高性能

12. 代理模式 (Proxy):为其他对象提供一种代理以控制对这个对象的访问。

  • 示例: 一个远程服务调用系统中,通过代理对象来控制访问权限或增加网络传输的优化。
  • 场景: 适用于需要控制对对象的访问、延迟加载或远程调用的场景。

行为型模式 (Behavioral Patterns)

13. 责任链模式 (Chain of Responsibility):为请求创建一个接收者对象的链。这种模式使得多个对象都有机会处理请求,避免了请求的发送者和接收者之间的耦合关系。

  • 示例: 一个支付系统,支持多种支付方式(如信用卡、PayPal),可以通过策略模式将不同的支付算法封装在独立的策略类中。
  • 场景: 当一个系统需要动态选择算法或行为时,策略模式提供了一种灵活的解决方案。

14. 命令模式 (Command):将请求封装成对象,从而使得不同的请求、队列或者日志参数化,并且支持可撤销操作。

  • 示例: 在一个报告生成系统中,不同类型的报告生成流程类似但细节不同,可以通过模板方法模式定义一个通用的模板,并由子类实现具体步骤。
  • 场景: 当多个类之间有相似的流程逻辑时,模板方法模式可以减少代码重复。

15. 解释器模式 (Interpreter):为语言创建解释器,为语言的文法表示定义一种解释器。

  • 示例: 一个股票交易系统中,当股票价格变化时,多个观察者(如手机应用、网页)会收到通知并更新数据。
  • 场景: 当一个对象的变化需要通知多个依赖对象时,观察者模式是一种很好的选择。

16. 迭代器模式 (Iterator):提供一种方法顺序访问一个聚合对象中的各个元素,而又不暴露该对象的内部表示。

  • 示例: 在一个集合类中,迭代器模式允许用户顺序访问集合中的元素,而无需暴露集合的内部实现。
  • 场景: 当需要对一个聚合对象(如列表、集合)进行遍历操作时,迭代器模式提供了一个统一的接口。

17. 中介者模式 (Mediator):用一个中介对象来封装一系列对象之间的交互。中介者使各对象不需要显式地相互引用,从而使它们可以松散耦合。

  • 示例: 在一个请求处理系统中,不同的处理器(如日志记录、权限检查)形成一条链,请求在链中传递,直到找到能处理的处理器。
  • 场景: 当一个请求需要经过多个对象处理,但处理者不固定时,职责链模式可以提供灵活的请求处理机制。

18. 备忘录模式 (Memento):在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,以便以后可以将对象恢复到原先保存的状态。

  • 示例: 在一个图形用户界面(GUI)中,按钮点击操作被封装成命令对象,命令模式可以方便地实现撤销、重做等功能。
  • 场景: 适用于将操作请求封装为对象的场景,特别是需要支持撤销操作时。

19. 观察者模式 (Observer):定义对象间的一种一对多的依赖关系,使得每当一个对象改变状态,则所有依赖于它的对象都会得到通知并自动更新。

  • 示例: 一个文本编辑器中,用户可以保存文档的快照并在需要时恢复到之前的状态。备忘录模式封装了对象的状态并提供恢复机制。
  • 场景: 当需要保存对象的历史状态以支持撤销操作时,备忘录模式是一个合适的选择。

20. 状态模式 (State):允许对象在内部状态改变时改变它的行为,对象看起来好像修改了它的类。

  • 示例: 一个电梯控制系统中,不同状态(如开门、关门、运行)下的行为不同,状态模式将每种状态的行为封装在独立的状态类中。
  • 场景: 当一个对象的行为随着状态的改变而改变时,状态模式提供了灵活的状态切换和行为管理。

21. 策略模式 (Strategy):定义一系列算法,把它们一个个封装起来,并且使它们可以互相替换。本模式使得算法可独立于使用它的客户而变化。

  • 示例: 在一个文件系统中,不同类型的文件需要执行不同的操作(如压缩、加密),访问者模式允许将操作分离出来并动态添加。
  • 场景: 当需要在不改变对象结构的前提下添加新操作时,访问者模式提供了灵活的扩展性。

22. 模板方法模式 (Template Method):定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变算法的结构即可重定义该算法的某些特定步骤。

  • 示例: 在一个聊天系统中,用户之间的消息传递通过一个中央中介(服务器)进行协调,中介者模式简化了对象间的通信。
  • 场景: 当多个对象之间存在复杂的交互关系时,中介者模式通过引入中介对象来简化系统的结构。

23. 访问者模式 (Visitor):表示一个作用于某对象结构中的各元素的操作。它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作。

  • 示例:在一个对象结构中,可能需要对其不同的元素执行不同的操作,如打印、计算等,使用访问者模式可以将操作封装在访问者对象中。
  • 应用:需要对对象结构中的元素执行多种操作的场景,如编译器中的语法树遍历、数据格式转换等。

这些模式在软件设计中广泛应用,帮助开发者创建灵活、可维护且可扩展的软件系统。

目录 

创建型模式 (Creational Patterns)

 结构型模式 (Structural Patterns)

行为型模式 (Behavioral Patterns)


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

de之梦-御风

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值