23中设计模式详解

news2024/12/27 0:19:36

文章目录

      • 一、创建型模式 (Creational Patterns)
      • 二、结构型模式 (Structural Patterns)
      • 三、行为型模式 (Behavioral Patterns)
      • 小结

设计模式是软件开发中总结和提炼的一些典型问题的解决方案,主要分为三大类: 创建型模式结构型模式行为型模式。以下是 23 种设计模式的分类及详解。


一、创建型模式 (Creational Patterns)

创建型模式主要解决对象的创建问题,旨在通过某种方式灵活地创建对象。

  1. 工厂方法模式 (Factory Method)
    定义一个接口或抽象类用于创建对象,由子类决定实例化哪一个类。
  • 关键点:延迟实例化到子类。
  • 适用场景:需要创建对象,但不确定具体类型时。
  • 示例:不同的日志记录器(文件日志、数据库日志)。
  1. 抽象工厂模式 (Abstract Factory)
    提供一个创建一系列相关或相互依赖对象的接口,而无需指定具体类。

    • 关键点:创建多个产品族对象。
    • 适用场景:一个系统要与多个产品族的产品一起工作。
    • 示例:跨平台 UI 工具包(Windows、Linux、macOS)。
  2. 单例模式 (Singleton)
    确保一个类只有一个实例,并提供全局访问点。

    • 关键点:控制实例化并提供全局访问。
    • 适用场景:需要全局唯一对象,如数据库连接池、线程池。
    • 示例:Java 中的 Runtime.getRuntime()
  3. 建造者模式 (Builder)
    将一个复杂对象的构建与表示分离,使得同样的构建过程可以创建不同的对象。

    • 关键点:逐步构建复杂对象。
    • 适用场景:对象构建流程复杂或步骤可变。
    • 示例:生成器模式构建复杂的文档或产品。
  4. 原型模式 (Prototype)
    通过复制已有对象来创建新对象,而不是通过实例化类。

    • 关键点:通过克隆方法复制对象。
    • 适用场景:对象的创建成本高,且实例化代价较大时。
    • 示例:Java 中的 clone() 方法。

二、结构型模式 (Structural Patterns)

结构型模式关注类和对象的组合,通过组合实现更大的结构。

  1. 适配器模式 (Adapter)
    将一个类的接口转换成客户端期望的另一个接口。

    • 关键点:接口不兼容但需协同工作。
    • 适用场景:需要使用已有类但接口不符。
    • 示例:电源适配器。
  2. 桥接模式 (Bridge)
    将抽象部分与实现部分分离,使它们可以独立变化。

    • 关键点:通过组合解耦抽象和实现。
    • 适用场景:需要独立扩展抽象和实现。
    • 示例:图形绘制系统。
  3. 装饰器模式 (Decorator)
    动态地给对象添加新的功能,而不改变其结构。

    • 关键点:装饰对象增强功能。
    • 适用场景:扩展功能但不希望修改代码。
    • 示例:Java I/O 类中的 BufferedReader
  4. 组合模式 (Composite)
    将对象组合成树形结构以表示“部分-整体”的层次结构。

    • 关键点:统一对象和组合的接口。
    • 适用场景:需要处理树形结构。
    • 示例:文件夹和文件的结构。
  5. 外观模式 (Facade)
    提供一个统一的接口,用来访问子系统中的一群接口。

    • 关键点:为复杂系统提供简单接口。
    • 适用场景:简化复杂系统的使用。
    • 示例:JDBC 中的 DriverManager
  6. 享元模式 (Flyweight)
    使用共享对象来有效支持大量细粒度对象。

    • 关键点:共享状态,减少内存消耗。
    • 适用场景:需要大量重复对象。
    • 示例:字符串常量池。
  7. 代理模式 (Proxy)
    为其他对象提供一个代理以控制对该对象的访问。

    • 关键点:控制目标对象访问。
    • 适用场景:延迟加载、权限控制等。
    • 示例:动态代理、RPC 远程调用。

三、行为型模式 (Behavioral Patterns)

行为型模式关注对象间的职责划分和协作方式。

  1. 策略模式 (Strategy)
    定义一组算法,将每种算法封装起来,并使它们可以互换。

    • 关键点:算法的可替换。
    • 适用场景:需要动态切换算法。
    • 示例:不同的支付方式实现。
  2. 模板方法模式 (Template Method)
    定义算法框架,将具体实现延迟到子类。

    • 关键点:固定框架,延迟具体实现。
    • 适用场景:算法固定,部分可定制。
    • 示例:抽象类定义通用流程。
  3. 观察者模式 (Observer)
    定义对象间的一对多依赖,当一个对象改变状态时,其所有依赖者都会收到通知。

    • 关键点:事件触发机制。
    • 适用场景:需要广播通知时。
    • 示例:事件监听机制。
  4. 责任链模式 (Chain of Responsibility)
    将请求沿着处理链传递,直到某个对象处理它。

    • 关键点:请求和处理解耦。
    • 适用场景:动态决定请求处理者。
    • 示例:日志处理器链。
  5. 命令模式 (Command)
    将请求封装成对象,便于存储、传递和撤销。

    • 关键点:封装请求。
    • 适用场景:请求需要排队或撤销。
    • 示例:任务队列。
  6. 迭代器模式 (Iterator)
    提供一种访问集合元素的方法,而不暴露集合的内部结构。

    • 关键点:遍历集合而不暴露实现。
    • 适用场景:需要统一遍历接口。
    • 示例:Java 中的 Iterator
  7. 中介者模式 (Mediator)
    通过中介者对象封装对象之间的交互。

    • 关键点:简化对象之间通信。
    • 适用场景:多个对象存在复杂交互。
    • 示例:MVC 模式中的 Controller。
  8. 备忘录模式 (Memento)
    保存对象的状态,以便在需要时恢复。

    • 关键点:状态快照。
    • 适用场景:需要撤销操作时。
    • 示例:文本编辑器的撤销功能。
  9. 状态模式 (State)
    允许对象在内部状态改变时改变其行为。

    • 关键点:状态驱动行为。
    • 适用场景:行为依赖于状态。
    • 示例:线程状态转换。
  10. 访问者模式 (Visitor)
    为对象结构添加新功能,而不改变结构本身。

    • 关键点:分离数据结构和行为。
    • 适用场景:需要对结构不同的元素添加新功能。
    • 示例:文件系统扫描器。
  11. 解释器模式 (Interpreter)
    定义一个语言的语法表示,并提供解释器来处理语法。

    • 关键点:解析和执行语言。
    • 适用场景:实现简单的脚本或规则引擎。
    • 示例:正则表达式引擎。

小结

  • 创建型模式:关注对象创建。
  • 结构型模式:关注对象组合与结构。
  • 行为型模式:关注对象间的交互与职责。

掌握设计模式可以提高代码复用性、扩展性和可维护性,是提升编程能力的重要途径。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2254426.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

JAVA |日常开发中JSTL标签库详解

JAVA &#xff5c;日常开发中JSTL标签库详解 前言一、JSTL 概述1.1 定义1.2 优势 二、JSTL 核心标签库2.1 导入 JSTL 库2.2 <c:out>标签 - 输出数据2.3 <c:if>标签 - 条件判断2.4 <c:choose>、<c:when>和<c:otherwise>标签 - 多条件选择 结束语优…

NAT traversal 原理 | TCP / UDP/ P2P

注&#xff1a;本文为 “NAT traversal ”相关的几篇文章合辑。 未整理去重。 NAT 穿越技术原理 Li_yy123 于 2020-12-08 18:54:26 发布 一、NAT 由来 为了解决全球公有 IPv4 的稀缺&#xff0c;提出了 NAT 技术。NAT 是 Network Address Translation 网络地址转换的缩写。 …

P3916 图的遍历(Tarjan缩点和反向建边)

P3916 图的遍历 - 洛谷 | 计算机科学教育新生态 写法一&#xff1a;Tarjan 思路&#xff1a;先运用Tarjan算法得到每个连通块中最大的编号&#xff0c;然后对每个连通块进行缩点重新建图&#xff0c;进行dfs&#xff0c;得到缩点后的连通块能够达到的最大编号。 Code: conste…

数据结构与算法学习笔记----堆

数据结构与算法学习笔记----堆 author: 明月清了个风 first publish time: 2024.12.2 revised: 2024.12.3 - 例题标题错误&#xff0c;已修改。 ps⛹从这里开始调整了文章结构&#xff0c;先讲解算法和数据结构基本原理&#xff0c;再给出例题&#xff0c;针对例题中的应用再…

【C++】格式化输出详解:掌握 cout 的进阶用法

博客主页&#xff1a; [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: C 文章目录 &#x1f4af;前言&#x1f4af;格式化输出的理论概述&#x1f4af;控制输出宽度和填充字符setw 操作符setfill 操作符 &#x1f4af;控制浮点数的显示格式fixed 与 scientificsetprecision &#x1f4af;…

Rust : 生成日历管理markdown文件的小工具

需求&#xff1a; 拟生成以下markdown管理小工具&#xff0c;这也是我日常工作日程表。 可以输入任意时间段&#xff0c;运行后就可以生成以上的markdown文件。 一、toml [package] name "rust-workfile" version "0.1.0" edition "2021"[d…

Spring01——Spring Framework系统架构

spring学习路线 Spring Framework系统架构 相关概念 低耦合&#xff1a;是指系统中各个模块或组件之间的依赖性较低&#xff0c;即它们之间的联系较少、交互简单。这种设计原则的目的是为了提高系统的灵活性和可维护性&#xff0c;便于模块的独立开发、测试和替换。解耦&…

MicroBlaze软核开发(一):Hello World

实现功能&#xff1a;使用 MicroBlaze软核 串口打印 Hello World Vivado版本&#xff1a;2018.3 目录 MicroBlaze介绍 vivado部分&#xff1a; 一、新建工程 二、配置MicroBlaze 三、添加Uart串口IP 四、生成HDL文件编译 SDK部分&#xff1a; 一、导出硬件启动SDK 二、…

ZLMediaKit+wvp (ffmpeg+obs)推拉流测试

这里使用了两种方式: ffmpeg命令和 OBS OBS推流在网上找了些基本没有说明白的, 在ZLMediaKit的issues中看到了一个好大哥的提问在此记录一下 使用OBS推流&#xff0c;rtmp&#xff0c;报鉴权失败 推流 1. ffmpeg命令推流 官方说明文档地址: 推流规则 rtsp://192.168.1.4:10554…

微信小程序之简单的数据中心管理平台(1)

微信小程序之简单的数据中心管理平台&#xff08;1&#xff09; 引言 随着微信小程序的广泛应用&#xff0c;越来越多的企业开始探索如何利用这一技术开发高效、便捷的管理平台。数据中心管理作为信息化建设的重要组成部分&#xff0c;需要一个灵活、可扩展的界面来实现资源的…

【计算机网络】实验13:运输层端口

实验13 运输层端口 一、实验目的 本次实验旨在验证TCP和IP运输层端口号的作用&#xff0c;深入理解它们在网络通信中的重要性。通过实验&#xff0c;我将探讨端口号如何帮助区分不同的应用程序和服务&#xff0c;使得在同一台主机上能够同时运行多个网络服务而不发生冲突。此…

人工智能学习用的电脑安装cuda、torch、conda等软件,版本的选择以及多版本切换

接触人工智能的学习三个月了&#xff0c;每天与各种安装包作斗争&#xff0c;缺少依赖包、版本高了、版本低了、不兼容了、系统做一半从头再来了。。。这些都是常态。三个月把单位几台电脑折腾了不下几十次安装&#xff0c;是时候总结一下踩过的坑和积累的经验了。 以一个典型的…

数组常见查找算法

文章目录 时间复杂度1. 顺序查找&#xff08;Linear Search&#xff09;2. 二分查找&#xff08;Binary Search&#xff09;3. 插值查找&#xff08;Interpolation Search&#xff09;4.分块查找5.哈希查找 时间复杂度 衡量算法执行时间随输入规模增长而增长的速度的一个概念。…

langgraph 多智能体 Multi-agent supervisor

1. 工具定义 1.1网络搜索工具 from typing import Annotated import os from langchain_community.tools.tavily_search import TavilySearchResults from langchain_core.tools import tool from langchain_experimental.utilities import PythonREPLos.environ["TAVIL…

【Maven系列】深入解析 Maven 镜像配置

前言 Maven 是一个流行的 Java 项目管理和构建工具&#xff0c;可以自动化构建项目、管理依赖、生成报告等。在Maven构建项目时&#xff0c;通常经常需要下载各种依赖。默认情况下&#xff0c;Maven 会从中央仓库下载这些依赖&#xff0c;但在某些情况下&#xff0c;这个过程可…

HTML 添加 文本水印

body,html {margin: 0;height: 100vh;width: 100vw;} // 自定义文案const setting {text: "水印文案", // 水印内容innerDate: true, // 在水印下方增加日期width: 110, // 水印宽度};// 自定义文字水印const watermark (function () {return {build: function (a…

华为HCIE-Datacom认证笔试+实验考试介绍

华为HCIE数通认证考试是面向那些希望成为数通网络领域专家的人员&#xff0c;考试通常两部分&#xff1a;笔试和实验考试。 考试科目&#xff1a; HCIE-Datacom笔试考试内容&#xff1a; HCIE-Datacom V1.0考试覆盖数据通信领域路由交换高阶技术、企业网络架构全景、园区网络…

PyCharm+Selenium+Pytest配置小记

1、下载ChromeDriver&#xff1a; Chrome130以后的Driver下载&#xff1a; Chrome for Testing availabilityhttps://googlechromelabs.github.io/chrome-for-testing/ &#xff08;1&#xff09;查看自己Crome浏览器的版本&#xff1a;设置-->关于 Chrome&#xff1b; &…

我们来学webservie - WSDL

WSDL 题记WSDL系列文章 题记 举个例子 酒桌上大领导们谈笑风生&#xff0c;把酒临风,其喜洋洋者矣老张说能签下xx项目&#xff0c;一来证明了集团在行业中的翘楚地位&#xff0c;二来感谢各位领导给予的大力支持接下来的一周&#xff0c;项目经理、业务顾问相继入场&#xff0…

weblogic开启https

JSK证书生成 生成密钥库和证书 使用Java的keytool命令来生成一个Java密钥库&#xff08;Keystore&#xff09;和证书。keytool是Java开发工具包&#xff08;JDK&#xff09;中用于管理密钥库和证书的命令行工具。 #创建证书存放目录 [weblogicosb1 jksHL]$ mkdir -p /home/w…