第三篇 结构型设计模式 - 简化复杂系统的结构

简介: 第三篇 结构型设计模式 - 简化复杂系统的结构


结构型设计模式关注类和对象的组合方式,旨在简化复杂系统的结构,提高代码的可重用性和可维护性。以下是七种常见的结构型设计模式的详解及其应用场景。

1. 适配器模式详解及其应用场景

详解:

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

在适配器模式中,通常包含以下角色:

  • Target(目标)接口:定义客户端需要的接口。
  • Adapter(适配器)类:实现 Target 接口,并持有被适配者(Adaptee)的实例,负责调用 Adaptee 的方法来满足 Target 接口的需求。
  • Adaptee(被适配者)类:拥有客户端期望得到的接口,但接口不兼容。

应用场景:

适配器模式适用于以下场景:

  • 当需要使用一个现有的类,但其接口不符合需求时。
  • 当需要将一组接口转换为另一组接口,使旧类能与新系统协同工作时。

例如,在编程中,可以创建一个适配器来将一个老版本的库接口转换为新版本的接口,以便在新项目中继续使用老库的功能。

2. 装饰器模式详解及其应用场景

详解:

装饰器模式动态地给一个对象添加一些额外的职责。装饰器提供了比继承更加灵活的方式来扩展对象的功能。

在装饰器模式中,通常包含以下角色:

  • Component(组件)接口:定义对象的基本功能。
  • Concrete Component(具体组件)类:实现了 Component 接口,是被装饰的对象。
  • Decorator(装饰器)抽象类:实现 Component 接口,持有对 Concrete Component 的引用,并定义了装饰器的行为。
  • Concrete Decorator(具体装饰器)类:继承自 Decorator 类,可以在原有功能的基础上添加新的行为。

应用场景:

装饰器模式适用于以下场景:

  • 当需要在运行时动态地给对象添加职责或修改其行为时。
  • 当需要为单个对象提供多个不同级别的服务或责任时。

例如,在咖啡店点餐系统中,可以创建各种装饰器(如糖、奶、巧克力酱等)来动态地添加到基本咖啡(Concrete Component)上,以满足客户的个性化需求。

3. 代理模式详解及其应用场景

详解:

代理模式为其他对象提供一种代理以控制对这个对象的访问。代理可以在访问目标对象前进行额外的操作,如权限检查、缓存、日志记录等。

在代理模式中,通常包含以下角色:

  • Subject(主题)接口:定义代理和真实主题的公共接口。
  • Real Subject(真实主题)类:实现了 Subject 接口,是被代理的对象。
  • Proxy(代理)类:也实现了 Subject 接口,持有对 Real Subject 的引用,并在必要时调用其方法。

应用场景:

代理模式适用于以下场景:

  • 当需要控制对对象的访问,如远程代理、保护代理、虚拟代理等。
  • 当需要在访问对象前或后执行额外的操作时。

例如,在网络编程中,可以创建一个远程代理来代表远程服务器的对象,本地客户端通过调用代理的方法来与远程服务器进行交互。

4. 外观模式详解及其应用场景

详解:

外观模式为子系统中的一组接口提供一个统一的高层接口,使得子系统更易于使用。

在外观模式中,通常包含以下角色:

  • Facade(外观)类:提供了一个简单的接口,用于访问子系统的功能。
  • Subsystem(子系统)类:实现子系统的功能,由 Facade 类调用。

应用场景:

外观模式适用于以下场景:

  • 当需要为复杂的子系统提供一个简单易用的接口时。
  • 当需要降低客户端与子系统之间的耦合度时。

例如,在操作系统中,可以创建一个文件管理器外观类,它封装了文件读写、目录操作、权限管理等多个子系统的功能,为用户提供一个简洁的界面。

5. 桥接模式详解及其应用场景

详解:

桥接模式将抽象部分与它的实现部分分离,使它们都可以独立地变化。

在桥接模式中,通常包含以下角色:

  • Abstraction(抽象)类:定义抽象接口,保持对 Implementor 对象的引用。
  • Refined Abstraction(细化抽象)类:扩展 Abstraction 类,改变与 Implementor 交互的方式。
  • Implementor(实现)接口:定义实现部分的接口。
  • Concrete Implementor(具体实现)类:实现 Implementor 接口,提供具体的实现。

应用场景:

桥接模式适用于以下场景:

  • 当一个类有多个维度的变化,且这些变化独立并且可能需要组合时。
  • 当希望避免使用继承来实现多态时。

例如,在图形用户界面编程中,可以创建一个桥接模式来将形状(矩形、圆形等)的表示与绘制引擎(OpenGL、DirectX 等)解耦,使得同一形状可以用不同的绘制引擎渲染。

6. 组合模式详解及其应用场景

详解:

组合模式允许你将对象组合成树形结构来表现“部分-整体”的层次结构。客户可以一致地处理单个对象和对象组合。

在组合模式中,通常包含以下角色:

  • Component(组件)接口:定义所有对象(包括叶子节点和容器节点)共有的接口。
  • Leaf(叶子)类:表示叶节点对象,没有子节点。
  • Composite(组合)类:表示容器节点对象,可以包含子节点,实现了 Component 接口。

应用场景:

组合模式适用于以下场景:

  • 当需要表示对象的部分-整体层次结构时。
  • 当希望客户能够一致地处理单个对象和对象组合时。

例如,在文件系统中,可以创建一个组合模式来表示文件和文件夹的层级关系,用户可以一致地操作单个文件或整个文件夹。

7. 享元模式详解及其应用场景

详解:享元模式运用共享技术有效地支持大量细粒度的对象。

在享元模式中,通常包含以下角色:

  • Flyweight(享元)接口:定义共享对象的接口。
  • Concrete Flyweight(具体享元)类:实现 Flyweight 接口,存储共享的信息。
  • Flyweight Factory(享元工厂)类:创建并管理享元对象,确保正确地共享对象。

应用场景:

享元模式适用于以下场景:

  • 当一个应用程序使用了大量的相似对象,造成内存消耗过大时。
  • 当对象的大部分状态可以外部化,从而使得多个对象可以共享相同的内部状态时。

例如,在在线游戏开发中,可以创建一个享元模式来共享大量的小图标资源,减少内存占用。

8. 综述

通过理解和应用这些结构型设计模式,开发者可以更好地组织和管理复杂系统的结构,提高代码的复用性和灵活性。在后续的文章中,我们将继续探讨行为型设计模式。

相关文章
|
2月前
|
设计模式 算法 数据库连接
PHP中的设计模式:如何优化你的代码结构
在本文中,我们将深入探讨PHP中的设计模式。设计模式是解决常见软件设计问题的最佳实践。它们不是具体的代码,而是一种编程经验的总结。掌握设计模式可以帮助你写出更高效、灵活和可维护的代码。本文将介绍几种常见的设计模式,并通过示例展示如何在PHP项目中应用这些模式。无论你是PHP初学者还是有经验的开发者,都能从本文中获得启发和实用的技巧。
|
3月前
|
设计模式 存储 前端开发
揭秘.NET架构设计模式:如何构建坚不可摧的系统?掌握这些,让你的项目无懈可击!
【8月更文挑战第28天】在软件开发中,设计模式是解决常见问题的经典方案,助力构建可维护、可扩展的系统。本文探讨了.NET中三种关键架构设计模式:MVC、依赖注入与仓储模式,并提供了示例代码。MVC通过模型、视图和控制器分离关注点;依赖注入则通过外部管理组件依赖提升复用性和可测性;仓储模式则统一数据访问接口,分离数据逻辑与业务逻辑。掌握这些模式有助于开发者优化系统架构,提升软件质量。
50 5
|
3月前
|
前端开发 C# 设计模式
“深度剖析WPF开发中的设计模式应用:以MVVM为核心,手把手教你重构代码结构,实现软件工程的最佳实践与高效协作”
【8月更文挑战第31天】设计模式是在软件工程中解决常见问题的成熟方案。在WPF开发中,合理应用如MVC、MVVM及工厂模式等能显著提升代码质量和可维护性。本文通过具体案例,详细解析了这些模式的实际应用,特别是MVVM模式如何通过分离UI逻辑与业务逻辑,实现视图与模型的松耦合,从而优化代码结构并提高开发效率。通过示例代码展示了从模型定义、视图模型管理到视图展示的全过程,帮助读者更好地理解并应用这些模式。
88 0
|
4月前
|
设计模式 存储 缓存
Java面试题:结合设计模式与并发工具包实现高效缓存;多线程与内存管理优化实践;并发框架与设计模式在复杂系统中的应用
Java面试题:结合设计模式与并发工具包实现高效缓存;多线程与内存管理优化实践;并发框架与设计模式在复杂系统中的应用
50 0
|
5月前
|
设计模式 程序员
结构型设计模式之适配器模式
结构型设计模式之适配器模式
|
5月前
|
设计模式
结构型设计模式之装饰模式
结构型设计模式之装饰模式
|
5月前
|
设计模式 编解码 网络安全
结构型设计模式之代理模式
结构型设计模式之代理模式
|
6月前
|
设计模式 Java Go
[设计模式Java实现附plantuml源码~结构型]不兼容结构的协调——适配器模式
[设计模式Java实现附plantuml源码~结构型]不兼容结构的协调——适配器模式
|
6月前
|
设计模式 存储 Java
[设计模式Java实现附plantuml源码~结构型]实现对象的复用——享元模式
[设计模式Java实现附plantuml源码~结构型]实现对象的复用——享元模式
|
6月前
|
设计模式 JavaScript Java
[设计模式Java实现附plantuml源码~结构型]处理多维度变化——桥接模式
[设计模式Java实现附plantuml源码~结构型]处理多维度变化——桥接模式