23种设计模式

一、创建型模式(Creational Patterns)

聚焦对象创建过程,简化复杂对象的实例化。

  1. 单例模式(Singleton)

    • 定义:确保一个类仅有一个实例,并提供全局访问点。
    • 示例:日志管理器、配置中心。
  2. 工厂模式(Factory Method)

    • 定义:定义创建对象的接口,由子类决定实例化哪个类。
    • 示例:根据用户类型创建不同的用户对象。
  3. 抽象工厂模式(Abstract Factory)

    • 定义:提供一个创建一系列相关或依赖对象的接口,无需指定具体类。
    • 示例:跨平台 UI 组件库(如鸿蒙、Android、iOS 的按钮工厂)。
  4. 建造者模式(Builder)

    • 定义:分步构建复杂对象,分离构造与表示。
    • 示例:配置一个包含多个参数的网络请求对象。
  5. 原型模式(Prototype)

    • 定义:通过克隆现有对象创建新对象,避免重复初始化。
    • 示例:游戏中快速复制角色对象。

二、结构型模式(Structural Patterns)

关注类和对象的组合,优化系统结构。

  1. 适配器模式(Adapter)

    • 定义:将一个类的接口转换为另一个接口,使不兼容的类可以协同工作。
    • 示例:将旧版本的 API 适配到新系统中。
  2. 桥接模式(Bridge)

    • 定义:分离抽象与实现,使两者可以独立变化。
    • 示例:将 UI 组件的抽象类与具体渲染实现分离。
  3. 装饰器模式(Decorator)

    • 定义:动态添加功能到对象,避免继承的局限性。
    • 示例:给图片加载组件添加缓存、压缩等功能。
  4. 组合模式(Composite)

    • 定义:将对象组合成树形结构,统一处理单个对象和组合对象。
    • 示例:文件系统中的目录和文件管理。
  5. 外观模式(Facade)

    • 定义:为子系统提供统一接口,简化复杂子系统的使用。
    • 示例:支付系统的统一接口封装(支付宝、微信支付等)。
  6. 享元模式(Flyweight)

    • 定义:共享细粒度对象,减少内存消耗。
    • 示例:游戏中大量重复的子弹、粒子效果对象。
  7. 代理模式(Proxy)

    • 定义:为其他对象提供代理以控制访问。
    • 示例:网络请求的代理缓存、权限控制。

三、行为型模式(Behavioral Patterns)

处理对象间的交互和职责分配。

  1. 策略模式(Strategy)

    • 定义:定义算法族,使它们可互换,策略的变化独立于使用它的客户。
    • 示例:电商平台的促销策略(满减、折扣、赠品)。
  2. 责任链模式(Chain of Responsibility)

    • 定义:将请求传递给处理者链,直到有一个处理者响应。
    • 示例:请假审批流程(员工→主管→经理)。
  3. 命令模式(Command)

    • 定义:将请求封装为对象,支持撤销、重做等操作。
    • 示例:文本编辑器的撤销 / 重做功能。
  4. 迭代器模式(Iterator)

    • 定义:提供遍历集合元素的统一接口,隐藏集合内部结构。
    • 示例:遍历列表、树结构等数据集合。
  5. 中介者模式(Mediator)

    • 定义:用中介对象封装对象间的交互,减少对象间的直接依赖。
    • 示例:聊天系统中用户间的消息传递。
  6. 备忘录模式(Memento)

    • 定义:捕获对象状态并保存,以便恢复。
    • 示例:游戏进度保存与恢复。
  7. 观察者模式(Observer)

    • 定义:对象间的一对多依赖,当对象状态变化时通知所有依赖者。
    • 示例:股票价格实时更新通知。
  8. 状态模式(State)

    • 定义:对象行为随状态改变而变化,状态作为独立类。
    • 示例:订单状态机(待支付→已支付→已发货)。
  9. 模板方法模式(Template Method)

    • 定义:定义算法骨架,子类实现具体步骤。
    • 示例:HTTP 请求的模板(预处理→发送→后处理)。
  10. 访问者模式(Visitor)

    • 定义:将数据结构与操作分离,允许在不修改数据结构的前提下添加新操作。
    • 示例:文档解析器支持多种格式(HTML、Markdown)的访问。

四、总结

  • 创建型:解决对象创建的复杂性,如单例、工厂。
  • 结构型:优化类 / 对象的组合,如适配器、装饰器。
  • 行为型:规范对象间的交互逻辑,如策略、观察者。

设计模式的选择需结合具体场景,其核心目标是提高代码的可维护性可扩展性复用性

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mysql-8.0.41-winx64 手动安装详细教程(2025版)

mysql-8.0.41-winx64 手动安装详细教程(2025版) 一、下载安装包二、配置环境变量三、安装配置四、启动 MySQL 服务,修改密码 一、下载安装包 安装地址如下: https://dev.mysql.com/downloads/mysql/使用7-zip或其他解压软件&…

wireguard搭配udp2raw部署内网

前言 上一篇写了使用 wireguard 可以非常轻松的进行组网部署,但是如果服务器厂商屏蔽了 udp 端口,那就没法了 针对 udp 被服务器厂商屏蔽的情况,需要使用一款 udp2raw 或 socat 类似的工具,来将 udp 打包成 tcp 进行通信 这里以…

[杂学笔记] TCP和UDP的区别,对http接口解释 , Cookie和Session的区别 ,http和https的区别 , 智能指针 ,断点续传

文章目录 1. TCP和UDP的区别2. 对http接口解释3. Cookie和Session的区别4. http和https的区别5. 智能指针6.断点续传 1. TCP和UDP的区别 tcp的特点: 面向连接,可靠性高,全双工,面向字节流udp特点:无连接,不…

Qt入门笔记

目录 一、前言 二、创建Qt项目 2.1、使用向导创建 2.2、最简单的Qt应用程序 2.2.1、main函数 2.2.2、widget.h文件 2.2.3、widget.cpp文件 2.3、Qt按键Botton 2.3.1、创建一个Botton 2.3.2、信号与槽 2.3.3、按键使用信号与槽的方法 2.4、文件Read与Write-QFile类 2…

Unity辅助工具_头部与svn

Unity调用者按钮增加PlaySideButton using QQu; using UnityEditor; using UnityEngine; [InitializeOnLoad] public class PlaySideButton {static PlaySideButton(){UnityEditorToolbar.RightToolbarGUI.Add(OnRightToolbarGUI);UnityEditorToolbar.LeftToolbarGUI.Add(OnLe…

ubuntu软件

视频软件,大部分的编码都能适应 sudo apt install vlc图片软件 sudo apt install gwenview截图软件 sudo apt install flameshot设置快捷键 flameshot flameshot gui -p /home/cyun/Pictures/flameshot也就是把它保存到一个自定义的路径 菜单更换 sudo apt r…

Spring (十)事务

目录 一 Spring数据库的相关配置: 1 导入包: 2 配置数据库连接信息 3 可以直接使用:DataSource,JdbcTemplate 二 事务管理: 1 事务管理的实现 1.1 开启Spring事务管理 1.2 为指定方法添加事务 2 关键类与接口 2.1 事务拦…

【MySQL_04】数据库基本操作(用户管理--配置文件--远程连接--数据库信息查看、创建、删除)

文章目录 一、MySQL 用户管理1.1 用户管理1.11 mysql.user表详解1.12 添加用户1.13 修改用户权限1.14 删除用户1.15 密码问题 二、MySQL 配置文件2.1 配置文件位置2.2 配置文件结构2.3 常用配置参数 三、MySQL远程连接四、数据库的查看、创建、删除4.1 查看数据库4.2 创建、删除…

Java算术运算符与算术表达式

Java算术运算符包括(加、正号)、-(减、负号)、*(乘)、/(除)、%(求余)、(自增)和--(自减)。它们用于构建算术表…

【网络】HTTP协议、HTTPS协议

HTTP与HTTPS HTTP协议概述 HTTP(超文本传输协议):工作在OSI顶层应用层,用于客户端(浏览器)与服务器之间的通信,B/S模式 无状态:每次请求独立,服务器不保存客户端状态(通过Cookie/Session扩展状态管理)。基于TCP:默认端口80(HTTP)、443(HTTPS),保证可靠传输。请…

Linux 网络:skb 数据管理

文章目录 1. 前言2. skb 数据管理2.1 初始化2.2 数据的插入2.2.1 在头部插入数据2.2.2 在尾部插入数据 2.2 数据的移除 3. 小结 1. 前言 限于作者能力水平,本文可能存在谬误,因此而给读者带来的损失,作者不做任何承诺。 2. skb 数据管理 数…

考研数学复习之定积分定义求解数列极限(超详细教程)

定积分定义求解数列极限是一种将数列极限问题转化为定积分问题进行求解的方法。这种方法通常适用于那些和式数列极限,其主要思路是将数列的项看作是某个函数在某一点或某一段区间上的取值或某种形式的和,然后利用定积分的性质和计算方法,来求解这类数列的极限。 定积分定义 设函…

Linux-基础开发工具

1.软件包管理器 1.1什么是软件包 • 在Linux下安装软件, ⼀个通常的办法是下载到程序的源代码, 并进⾏编译, 得到可执⾏程序. • 但是这样太⿇烦了, 于是有些⼈把⼀些常⽤的软件提前编译好, 做成软件包(可以理解成windows上 的安装程序)放在⼀个服务器上, 通过包管理器可以很…

【无人机路径规划】基于麻雀搜索算法(SSA)的无人机路径规划(Matlab)

效果一览 代码获取私信博主基于麻雀搜索算法(SSA)的无人机路径规划(Matlab) 一、算法背景与核心思想 麻雀搜索算法(Sparrow Search Algorithm, SSA)是一种受麻雀群体觅食行为启发的元启发式算法&#xff0…

Redis未授权访问

一,Redis未授权访问 Redis默认配置存在以下安全隐患,导致未授权访问漏洞: 无认证机制:默认未启用密码认证(requirepass为空),允许任意用户连接。网络暴露:默认绑定所有接口&#xff…

Flutter 基础组件 Text 详解

目录 1. 引言 2. 基本使用 3. 自定义样式 4. 文本对齐与溢出控制 5. 外边距 5.1 使用 Container 包裹 5.2 使用 Padding 组件 5.3 在 Row/Column 中使用 5.4 动态边距调整 5.5 关键区别说明 5.6 设置 margin 无效 6. 结论 相关推荐 1. 引言 Text 组件是 Flutter 中…

数据库系统概论(二)数据模型

数据库系统概论(二)数据模型 数据库系统概论(二)数据模型前言一、数据建模二、概念模型三、数据模型的三要素四、层次模型五、网状模型六、关系模型 总结(核心概念速记): 数据库系统概论&#x…

Git基本概念及使用

目录 一、git安装 二、git仓库基本概念 1. 远程仓库(Remote): 2. 本地库(Repository): 3. 分支(Branch): 4.本地库和远程库的关系 三、git仓库的工作流程 四、gi…

详细介绍 Jupyter nbconvert 工具及其用法:如何将 Notebook 转换为 Python 脚本

nbconvert 是 Jupyter 提供的一个非常强大的工具,允许用户将 Jupyter Notebook 文件(.ipynb)转换成多种格式,包括 Python 脚本(.py)、HTML、PDF、LaTeX 等。你可以通过命令行来运行 nbconvert,也…

⭐算法OJ⭐链表排序【归并排序】(C++/JavaScript 实现)

文章目录 148. Sort List解题思路归并排序的基本思想归并排序的步骤 实现实现步骤C 实现JavaScript 实现 复杂度总结 148. Sort List Given the head of a linked list, return the list after sorting it in ascending order. 解题思路 链表排序问题可以通过多种方法解决&am…