当前位置: 首页 > news >正文

【设计模式】 基本原则、设计模式分类

在这里插入图片描述

设计模式

设计模式是软件工程中的一种通用术语,指的是针对特定问题的经过实践验证的解决方案。设计模式并不是最终的代码实现,而是描述了如何解决某一类问题的思路和方法。

如果熟悉了设计模式,当遇到类似的场景,我们可以快速地参考设计模式实现代码。不仅可以加谏我们的编码速度,也提升了代码的可扩展性可重用性可维护性!

SOLID原则是面向对象设计中的五个基本原则,旨在提高软件的可维护性和可扩展性。

  1. 单一职责原则每个类应该只有一个职责,或者说每个类应该只有一个引起变化的原因
  2. 开放-关闭原则:软件实体(类、模块、函数等)应该对扩展开放,对修改关闭
  3. 里氏替换原则子类对象应该能够替换父类对象而不影响程序的正确性
  4. 接口隔离原则:不应该强迫一个类依赖于它不使用的接口。接口应该尽量小而专一,避免将多个不相关的功能放在同一个接口中
  5. 依赖倒置原则:高层模块不应该依赖于低层模块,,二者都应该依赖于抽象。抽象不应该依赖于细节,细节应该依赖于抽象面向接口编程

设计模式的分类

根据它们的目的和适用场景,设计模式一般可以分为三大类:

创建型模式(Creational Patterns)

这些模式与对象的创建有关,它们试图以一种或另一种方式抽象化对象的创建过程,使得系统更加独立于如何创建、组合和表示这些对象。

  • 单例模式(Singleton Pattern):确保一个类只有一个实例,并提供一个全局访问点。
  • 工厂方法模式(Factory Method Pattern):定义一个用于创建对象的接口,但由子类决定实例化哪一个类
  • 抽象工厂模式(Abstract Factory Pattern):提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类
  • 建造者模式(Builder Pattern):将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示(如:Lombok中的@Builder)。
  • 原型模式(Prototype Pattern):用原型实例指定创建对象的种类,并且通过复制这些原型创建新的对象。

结构型模式(Structural Patterns)

这些模式处理类或对象的组合。它们使用继承机制来组合接口或实现。

  • 适配器模式(Adapter Pattern):将一个类的接口转换成客户端所期望的另一个接口。
  • 桥接模式(Bridge Pattern):将一个事物的抽象部分与它的实现部分分离开来,使它们都可以独立变化。
  • 组合模式(Composite Pattern):将对象组合成树形结构以表示“部分-整体”的层次结构。
  • 装饰模式(Decorator Pattern):动态地给一个对象添加一些额外的职责。
  • 外观模式(Facade Pattern):为子系统中的一组接口提供一个一致的界面。
  • 享元模式(Flyweight Pattern):运用共享技术有效地支持大量细粒度的对象。
  • 代理模式(Proxy Pattern):为其他对象提供一种代理以控制对这个对象的访问。

行为型模式(Behavioral Patterns)

这些模式特别关注对象之间的责任分配以及算法和对象之间通信的方式。

  • 责任链模式(Chain of Responsibility Pattern):使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合。
  • 命令模式(Command Pattern):将请求封装成对象,从而使你可以用不同的请求对客户进行参数化。
  • 解释器模式(Interpreter Pattern):给定一个语言,定义它的文法的一种表示,并定义一个解释器,该解释器使用该表示来解释语言中的句子。
  • 迭代器模式(Iterator Pattern):提供一种方法顺序访问一个聚合对象中各个元素,而又不需暴露其内部的表示。
  • 中介者模式(Mediator Pattern):用一个中介对象来封装一系列的对象交互。
  • 备忘录模式(Memento Pattern):在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。
  • 观察者模式(Observer Pattern):定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并自动更新。
  • 状态模式(State Pattern):允许一个对象在其内部状态改变时改变它的行为。
  • 策略模式(Strategy Pattern):定义一系列算法,把它们一个个封装起来,并且使它们可以互相替换。
  • 模板方法模式(Template Method Pattern):定义一个操作中的算法骨架,而将一些步骤延迟到子类中。
  • 访问者模式(Visitor Pattern):表示一个作用于某对象结构中的各元素的操作。它使你可以在不改变各元素类的前提下定义作用于这些元素的新操作。

每种模式都有其特定的应用场景和优点,在实际开发中,选择合适的设计模式可以提高代码的可读性可维护性灵活性

相关文章:

【设计模式】 基本原则、设计模式分类

设计模式 设计模式是软件工程中的一种通用术语,指的是针对特定问题的经过实践验证的解决方案。设计模式并不是最终的代码实现,而是描述了如何解决某一类问题的思路和方法。 如果熟悉了设计模式,当遇到类似的场景,我们可以快速地…...

Swift White Hawkstrider

Swift White Hawkstrider 迅捷白色陆行鸟 Swift White Hawkstrider - Item - 魔兽世界怀旧服TBC数据库_WOW2.43数据库_70级《燃烧的远征》数据库 Kaelthas Sunstrider (1) <Lord of the Blood Elves> 凯尔萨斯逐日者. 掉落 [80圣骑士][Alonsus-加丁][诺森德冒险补给品…...

node.js下载、安装、设置国内镜像源(永久)(Windows11)

目录 node-v20.18.0-x64 工具下载安装设置国内镜像源&#xff08;永久&#xff09; node-v20.18.0-x64 工具 系统&#xff1a;Windows 11 下载 官网https://nodejs.org/zh-cn/download/package-manager 版本我是跟着老师选的node-v20.18.0-x64如图选择 Windows、x64、v2…...

「Mac畅玩鸿蒙与硬件48」UI互动应用篇25 - 简易购物车功能实现

本篇教程将带你实现一个简易购物车功能。通过使用接口定义商品结构&#xff0c;我们将创建一个动态购物车&#xff0c;支持商品的添加、移除以及实时总价计算。 关键词 UI互动应用接口定义购物车功能动态计算商品管理列表操作 一、功能说明 简易购物车功能包含以下交互&#…...

df.groupby(pd.Grouper(level=1)).sum()

df.groupby(pd.Grouper(level1)).sum() 在 Python 中的作用是根据 DataFrame 的某一索引级别进行分组&#xff0c;并计算每个分组的总和。具体来说&#xff1a; df.groupby(...)&#xff1a;这是 pandas 的分组操作&#xff0c;按照指定的规则将 DataFrame 分组。 pd.Grouper(…...

【网络安全 | 漏洞挖掘】绕过电子邮件确认实现预账户接管

未经许可,不得转载。 文章目录 正文漏洞步骤赏金正文 我测试的应用程序有多个子域名: 1、account.example.com:处理用户账户管理。 2、project.example.com:管理用户拥有或被邀请的项目。 3、org.example.com:一个新的子域,用于管理多个项目的组织。 4、collaborator.ex…...

【SpringBoot教程】SpringBoot整合Mybatis - 前后端分离项目 - vue3

&#x1f64b;大家好&#xff01;我是毛毛张! &#x1f308;个人首页&#xff1a; 神马都会亿点点的毛毛张 今天毛毛张将通过一个完整的前后端分离的任务来介绍SpringBoot整合Mybatis过程&#xff01; 文章目录 1.前言1.1 任务描述1.2 SpringBoot整合Mybatis概述1.3 完整项目…...

node.js之---事件驱动编程

详解事件驱动 事件驱动是基于什么实现的 事件驱动和I/O操作的关系 I/O操作和事件循环的关系 详解事件驱动 事件驱动编程&#xff08;Event-driven Programming&#xff09;是一种编程范式&#xff0c;其中程序的控制流是由“事件”驱动的。事件通常指的是用户操作、网络请…...

RK3588+FPGA全国产异步LED显示屏控制卡/屏幕拼接解决方案

RK3588FPGA核心板采用Rockchip RK3588新一代旗舰 级八核64位处理器&#xff0c;支持8K视频编解码&#xff0c;多屏4K输出&#xff0c;可实现12屏联屏拼接、同显、异显&#xff0c;适配多种操作系统&#xff0c;广泛适用于展览展示、广告内容投放、新零售、商超等领域实现各种媒…...

Postman测试big-event

报错500。看弹幕&#xff0c;知道可能是yml或sql有问题。 所以检查idea工作台&#xff0c; 直接找UserMapper检查&#xff0c;发现完全OK。 顺着这个error发现可能是sql有问题。因为提示是sql问题&#xff0c;而且是有now()的那个sql。 之后通过给的课件&#xff0c;复制课件…...

38. 考古学家

题目描述 有一个考古学家发现一个石碑&#xff0c;但是很可惜&#xff0c;发现时其已经断成多段&#xff0c;原地发现n个断口整齐的石碑碎片。为了破解石碑内容&#xff0c;考古学家希望有程序能帮忙计算复原后的石碑文字组合数&#xff0c;你能帮忙吗&#xff1f; 输入描述 第…...

商用车自动驾驶,迎来大规模量产「临界点」?

商用车自动驾驶&#xff0c;正迎来新的行业拐点。 今年初&#xff0c;交通部公开发布AEB系统运营车辆标配征求意见稿&#xff0c;首次将法规限制条件全面放开&#xff0c;有望推动商用车AEB全面标配&#xff0c;为开放场景的商用车智能驾驶市场加了一把火。 另外&#xff0c;…...

中建海龙:科技助力福城南产业片区绿色建筑发展

在快速发展的城市化进程中&#xff0c;绿色建筑以其环保、节能、可持续的特点日益受到重视。作为建筑工业化领域的领军企业&#xff0c;中建海龙科技有限公司&#xff08;简称“中建海龙”&#xff09;凭借其卓越的科技实力和创新举措&#xff0c;在推动绿色建筑发展方面做出了…...

selenium-side-runner + edge快速使用

安装和配置 Node.js 与 Selenium-Side-Runner 1. 安装 Node.js 为了使用 selenium-side-runner,首先需要在你的系统上安装 Node.js。Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行时,它允许开发者编写服务器端代码。 通过 Winget 安装 Node.js(适用于 Windows 10/…...

ARM发布Armv9.5架构:迈向更强性能与灵活性的新时代

2024年11月30日&#xff0c;ARM正式发布了其最新的Armv9.5架构&#xff0c;这是Arm技术发展的又一重要里程碑。从表中信息来看&#xff0c;Armv9.5架构的发布标志着该公司的架构系列在性能、灵活性和可扩展性方面取得了进一步突破。本次发布不仅是技术上的提升&#xff0c;更是…...

Pytorch的自动求导模块

文章目录 torch.autograd.backward()基本用法非标量张量的反向传播保留计算图指定输入张量高阶梯度计算 与 y.backward() 的区别torch.autograd.grad()基本用法非标量张量的梯度高阶梯度计算多输入、多输出的梯度计算未使用的输入张量保留计算图 与 backward() 的区别 torch.au…...

【React】- 跨域PDF预览、下载(改文件名)、打印

我们经常会碰到跨域来方位PDF&#xff0c;同时需要下载、打印的需求&#xff0c;通常由于浏览器的安全策略&#xff0c;可以预览&#xff0c;但是下载和打印可能会受限&#xff0c;这时候怎么办呢&#xff1f; 1.创建一个隐藏的标签 要下载 iframe 中的 PDF 文件&#xff0c;…...

HuggingFace 模型文件详解:如何加载本地模型?

HuggingFace 模型文件详解 在使用 HuggingFace 下载大型语言模型&#xff08;如 LLaMA-3-1-8B&#xff09;后&#xff0c;会发现模型目录下包含多个文件和文件夹。本文将详细介绍这些文件的作用以及它们在模型加载和推理过程中的功能。 文件结构总览 models--meta-llama--Lla…...

Boost之buffer

目录 一、定义和介绍 二、示例 1、点 单点 多点 2、线 3、面 单面 多面 三、总结 四、测试代码 一、定义和介绍 buffer函数是boost库(algorithms)算法模块中的构建缓冲区函数。 其函数原型为(此处为带策略型): template<typename GeometryIn, typename MultiPolygon, typen…...

[redux] ts声明useSelector和useDispatch

先安装 安装 | Redux 中文官网 npm install react-redux npm install reduxjs/toolkit 定义一个切片 import { createSlice } from reduxjs/toolkit;const userSlice createSlice({name: user,initialState: {name: lsm,age: 24,},reducers: {}, }); //注意这里写导出redu…...

计算机网络 (19)扩展的以太网

前言 以太网&#xff08;Ethernet&#xff09;是一种局域网&#xff08;LAN&#xff09;技术&#xff0c;它规定了包括物理层的连线、电子信号和介质访问层协议的内容。以太网技术不断演进&#xff0c;从最初的10Mbps到如今的10Gbps、25Gbps、40Gbps、100Gbps等&#xff0c;已成…...

Ubuntu 23.10 换源

查看当前Ubuntu系统的版本 使用命令&#xff1a; lsb_release -a 中科大源&#xff1a; deb https://mirrors.ustc.edu.cn/ubuntu-old-releases/ubuntu/ mantic main restricted universe multiverse deb-src https://mirrors.ustc.edu.cn/ubuntu-old-releases/ubuntu/ man…...

如何在 Ubuntu 22.04 上优化 Apache 以应对高流量网站教程

简介 在本教程中&#xff0c;我们将学习如何优化 Apache 以应对高流量网站。 当运行高流量网站时&#xff0c;确保你的 Apache Web 服务器得到优化对于有效处理负载至关重要。在本指南中&#xff0c;我们将介绍配置 Apache 以提高性能和可扩展性的基本技巧。 为高流量网站优…...

Android 性能优化:内存优化(实践篇)

1. 前言 前一篇文章Android性能优化&#xff1a;内存优化 &#xff08;思路篇&#xff09; 大概梳理了Android 内存原理和优化的必要性及应该如何优化&#xff0c;输出了一套短期和长期内存优化治理的SOP方案。 那么这一篇文章就总结下我最近在做内存优化如何实践的&#xff0…...

开源数据集成平台白皮书重磅发布《Apache SeaTunnel 2024用户案例合集》!

2025年新年临近&#xff0c;Apache SeaTunnel 社区用户案例精选&#x1f4d8;也跟大家见面啦&#xff01;在过去的时间里&#xff0c;SeaTunnel 社区持续成长&#xff0c;吸引了众多开发者的关注与支持。 为了致谢一路同行的伙伴&#xff0c;也为了激励更多人加入技术共创&…...

用python编写一个放烟花的小程序

import pygame import random # 代码解释及使用说明&#xff1a; # 首先&#xff0c;导入 pygame 和 random 库。pygame 用于创建游戏窗口和图形绘制&#xff0c;random 用于生成随机数。 # 初始化 pygame&#xff0c;并设置屏幕尺寸为 800x600 像素&#xff0c;设置窗口标题为…...

以一个实际例子来学习Linux驱动程序开发之“设备类”的相关知识【利用设备类实现对同一设备类下的多个LED灯实现点亮或关闭】

前言 对于一个设备的驱动程序来说&#xff0c;其实上层用户主要看到的、用到的就是设备文件和设备类&#xff0c;当然用得最多的是设备文件&#xff0c;虽然设备类用得不多&#xff0c;但也是每一个设备注册实例化时必须要用到的东西&#xff0c;本篇博文就以一个简单的例子说…...

培训机构Day22

今天主要还是围绕着jquery讲解的&#xff0c;没有什么可说的。 知识点&#xff1a; 常用事件类型&#xff1a; 1.click&#xff1a;单击事件。鼠标&#xff0c;或键盘都可以触发。 2.dblclick&#xff1a;双击事件。 3.contextmenu&#xff1a;右键事件。 4.键盘相关事件&…...

Synopsys软件基本使用方法

Synopsys软件基本使用方法 1 文件说明2 编译流程3 查看波形4 联合仿真 本文主要介绍Synopsys软件vcs、verdi的基本使用方法&#xff0c;相关文件可从 GitHub下载。 1 文件说明 创建verilog源文件add.v、mult.v、top.vmodule add (input signed [31:0] dina,input signed [3…...

信息科技伦理与道德1:研究方法

1 问题描述 1.1 讨论&#xff1f; 请挑一项信息技术&#xff0c;谈一谈为什么认为他是道德的/不道德的&#xff0c;或者根据使用场景才能判断是否道德。判断的依据是什么&#xff08;自身的道德准则&#xff09;&#xff1f;为什么你觉得你的道德准则是合理的&#xff0c;其他…...

手机租赁平台开发实用指南与市场趋势分析

内容概要 在当今快速变化的科技时代&#xff0c;手机租赁平台的发展如火如荼。随着越来越多的人希望使用最新款的智能手机&#xff0c;但又不愿意承担昂贵的购机成本&#xff0c;手机租赁平台应运而生。这种模式不仅为用户提供了灵活的选择&#xff0c;还为企业创造了新的商机…...

ABAQUS三维Voronoi晶体几何建模

材料晶体塑性理论与细观尺度上晶体几何模型相融合的模拟方法为探究材料在塑性变形过程中的行为机制以及晶体材料优化开辟了新途径。本案例演示在CAD软件内通过Voronoi建立晶体三维模型&#xff0c;并将模型导入到Abaqus CAE内&#xff0c;完成晶体材料的有限元建模。 在AutoC…...

职场常用Excel基础04-二维表转换

大家好&#xff0c;今天和大家一起分享一下excel的二维表转换相关内容~ 在Excel中&#xff0c;二维表&#xff08;也称为矩阵或表格&#xff09;是一种组织数据的方式&#xff0c;其中数据按照行和列的格式进行排列。然而&#xff0c;在实际的数据分析过程中&#xff0c;我们常…...

如何使用 ChatGPT Prompts 写学术论文?

第 1 部分:学术写作之旅:使用 ChatGPT Prompts 进行学术写作的结构化指南 踏上学术写作过程的结构化旅程,每个 ChatGPT 提示都旨在解决特定方面,确保对您的主题进行全面探索。 制定研究问题: “制定一个关于量子计算的社会影响的研究问题,确保清晰并与您的研究目标保持一…...

【深度学习】Java DL4J基于 LSTM 构建新能源预测模型

🧑 博主简介:CSDN博客专家,历代文学网(PC端可以访问:https://literature.sinhy.com/#/?__c=1000,移动端可微信小程序搜索“历代文学”)总架构师,15年工作经验,精通Java编程,高并发设计,Springboot和微服务,熟悉Linux,ESXI虚拟化以及云原生Docker和K8s,热衷于探…...

Jetson系列部署YOLOv8模型教程

简介 NVIDIA Jetson系列是专为边缘计算设计的紧凑型计算模块&#xff0c;其目标用户为AI开发者、嵌入式系统工程师以及需要在设备端实时进行数据处理与AI推断的创新者。通过提供灵活的硬件平台&#xff0c;结合NVIDIA强大的GPU计算资源&#xff0c;Jetson系列能够支持复杂的机…...

【HAProxy】如何在Ubuntu下配置HAProxy服务器

HAProxy 是一款免费、开源且强大的反向代理程序&#xff0c;它为 HTTP 和 TCP 基础的应用提供了高可用性、负载均衡以及代理功能&#xff0c;因此对于管理高流量服务器&#xff08;或 Web 应用&#xff09;来说&#xff0c;通过将负载分散到多个节点服务器上&#xff0c;它是一…...

gesp(C++一级)(7)洛谷:B3863:[GESP202309 一级] 小明的幸运数

gesp(C一级)&#xff08;7&#xff09;洛谷&#xff1a;B3863&#xff1a;[GESP202309 一级] 小明的幸运数 题目描述 所有个位数为 k k k 的正整数&#xff0c;以及所有 k k k 的倍数&#xff0c;都被小明称为“ k k k 幸运数”。小明想知道正整数 L L L 和 R R R 之间&a…...

【数据库系统概论】数据库完整性与触发器--复习

在数据库系统概论中&#xff0c;数据库完整性是指确保数据库中数据的准确性、一致性和有效性的一组规则和约束。数据库完整性主要包括实体完整性、参照完整性和用户定义完整性。以下是详细的复习内容&#xff1a; 1. 数据库完整性概述 数据库完整性是指一组规则&#xff0c;这…...

【YOLOv8模型网络结构图理解】

YOLOv8模型网络结构图理解 1 YOLOv8的yaml配置文件2 YOLOv8网络结构2.1 Conv2.2 C3与C2f2.3 SPPF2.4 Upsample2.5 Detect层 1 YOLOv8的yaml配置文件 YOLOv8的配置文件定义了模型的关键参数和结构&#xff0c;包括类别数、模型尺寸、骨干&#xff08;backbone&#xff09;和头部…...

使用 commitlint 和 husky 检查提交描述是否符合规范要求

在上一小节中&#xff0c;我们了解了 Git hooks 的概念&#xff0c;那么接下来我们就使用 Git hooks 来去校验我们的提交信息。 要完成这么个目标&#xff0c;那么我们需要使用两个工具&#xff1a; 注意&#xff1a;npm 需要在 7.x 以上版本。 1. commitlint 用于检查提交信…...

QT集成IntelRealSense双目摄像头3,3D显示

前两篇文章&#xff0c;介绍了如何继承intel realsense相机和opengl。 这里介绍如何给深度数据和色彩数据一块显示到opengl里面。 首先&#xff0c;需要了解深度数据和彩色数据是如何存储的。先说彩色数据。彩色图像一般都是RGB&#xff0c;也就是每个像素有三个字节&#xf…...

Vue 中el-table-column 进行循环,页面没渲染成功

文章目录 前言效果图代码示例可能出现的问题及原因解决思路 前言 实现效果&#xff1a;el-table-column 进行循环&#xff0c;使之代码简化 遇到的问题&#xff1a; data进行默认赋值&#xff0c;操作列的删除都可以出来&#xff0c;其他表格里面的数据没出来 效果图 示例&am…...

渗透测试-非寻常漏洞案例

声明 本文章所分享内容仅用于网络安全技术讨论&#xff0c;切勿用于违法途径&#xff0c;所有渗透都需获取授权&#xff0c;违者后果自行承担&#xff0c;与本号及作者无关&#xff0c;请谨记守法. 此文章不允许未经授权转发至除先知社区以外的其它平台&#xff01;&#xff0…...

Spring Boot 实战篇(四):实现用户登录与注册功能

目录 Spring Boot 实战篇&#xff08;四&#xff09;&#xff1a;实现用户登录与注册功能 一、用户注册功能 &#xff08;一&#xff09;前端页面设计&#xff08;简要提及&#xff09; &#xff08;二&#xff09;后端实现 二、用户登录功能 &#xff08;一&#xff09;…...

VScode SSH 错误:Got bad result from install script 解決

之前vscode好好的&#xff0c;某天突然连接报错如下 尝试1. 服务器没有断开,ssh可以正常连接 2. 用管理员权限运行vscode&#xff0c;无效 3. 删除服务器上的~/.vscode-server 文件夹&#xff0c;无效 试过很多后&#xff0c;原来很可能是前一天anaconda卸载导致注册表项 步…...

openGauss与GaussDB系统架构对比

openGauss与GaussDB系统架构对比 系统架构对比openGauss架构GaussDB架构 GaussDB集群管理组件 系统架构对比 openGauss架构 openGauss是集中式数据库系统&#xff0c;业务数据存储在单个物理节点上&#xff0c;数据访问任务被推送到服务节点执行&#xff0c;通过服务器的高并…...

【ArcGISPro/GeoScenePro】检查并处理高程数据

数据 https://arcgis.com/sharing/rest/content/items/535efce0e3a04c8790ed7cc7ea96d02d/data 数字高程模型 (DEM) 是一种栅格,可显示地面或地形的高程。 数字表面模型 (DSM) 是另一种高程栅格,可显示表面的高度,例如建筑物或树冠的顶部。 您需要准备 DEM 和 DSM 以供分析…...

WebRTC的三大线程

WebRTC中的三个主要线程&#xff1a; signaling_thread&#xff0c;信号线程&#xff1a;用于与应用层交互worker_thread&#xff0c;工作线程&#xff08;最核心&#xff09;&#xff1a;负责内部逻辑处理network_thread&#xff0c;网络线程&#xff1a;负责网络数据包的收发…...

HTML-文本标签

历史上&#xff0c;网页的主要功能是文本展示。所以&#xff0c;HTML 提供了大量的文本处理标签。 1.<div> <div>是一个通用标签&#xff0c;表示一个区块&#xff08;division&#xff09;。它没有语义&#xff0c;如果网页需要一个块级元素容器&#xff0c;又没…...