一.设计模式的基本概念

一.核心概念

对软件设计中重复出现问题的成熟解决方案,提供代码可重用性、可维护性和扩展性保障。核心原则包括:

1.1. 单一职责原则

  • 定义‌:一个类只承担一个职责,避免因职责过多导致的代码耦合。

1.2. 开闭原则

  • 定义‌:应对扩展开放,对修改关闭。
  • 说明‌:允许添加新功能而不破坏现有系统,已有代码应尽可能保持稳定不修改。

3. 里氏替换原则

  • 定义‌:子类必须能替换父类且不影响程序正确性
  • 说明:子类不改变父类原有行为,仅扩展功能。

1.4. 接口隔离原则

  • 定义‌:类不应依赖不需要的接口,需将庞大接口拆分为多个独立小接口
  • 说明‌:减少接口污染,避免类因无关方法被迫变更

1.5. 依赖倒置原则

  • 定义‌:高层模块不依赖低层模块,二者应共同依赖抽象
  • 说明‌:通过接口编程解耦。

1.6. 迪米特法则

  • 定义‌(最少知道原则):对象仅与直接朋友交互,减少与非直接类的依赖。
  • 说明‌:降低耦合,如A调用B,B调用C时,A无需知晓C的存在。

二.分类体系

2.1.创建型

解耦对象创建过程.

设计模式解耦手段适用场景
‌工厂方法模式‌子类实现工厂接口,封装具体对象的实例化过程需动态切换同类型对象(如不同数据库连接)
‌抽象工厂模式‌提供接口创建‌一组关联对象‌,隔离产品族依赖跨平台UI组件、多套数据库适配等场景
‌建造者模式‌分离复杂对象的‌构建步骤‌与表示方式构造含多部件的对象(如订单、配置对象)
‌原型模式‌通过复制原型实例创建新对象,绕过显式构造函数创建成本高的对象(如深度克隆配置模板)
‌单例模式‌全局唯一访问点,避免重复创建实例资源管理器、配置中心等需全局唯一性的场景

2.2.结构型

处理类/对象间的组合关系(包括组合、聚合和依赖关系)

2.2.1什么是组合关系?

关系类型生命周期依赖典型模式应用案例说明
‌组合关系‌
(‌Composition‌)
‌强绑定‌:部分对象不能独立于整体存在
(整体销毁则部分销毁)
‌组合模式‌:文件夹(整体)删除时,其内部文件(部分)同步销毁汽车引擎脱离汽车即失去功能意义
‌聚合关系‌
(‌Aggregation‌)
‌弱绑定‌:部分对象可独立于整体存在‌装饰器模式‌:移除咖啡的“牛奶装饰层”后,原始咖啡对象仍有效5
‌享元模式‌:棋子对象池独立于棋局存在
班级解散后,学生仍可作为独立个体存在
‌依赖关系‌
(‌Dependency‌)
‌临时性‌:通过参数传递临时使用对象‌代理模式‌:客户端通过代理对象间接访问真实对象(如网络请求代理)
‌适配器模式‌:适配器临时调用被适配对象
支付接口适配器中,仅在使用时临时依赖旧支付系统对象

2.2.2.结构性设计模式如何处理类/对象间的组合关系?

模式核心目的组合关系处理方式典型应用场景
‌适配器模式‌解决接口不兼容问题‌对象组合‌:适配器类聚合被适配对象,转换接口逻辑集成旧系统、第三方库适配
‌桥接模式‌分离抽象与实现,支持多维扩展‌组合抽象与实现‌:抽象类聚合实现接口,运行时动态绑定(如形状+渲染引擎组合)跨平台UI开发、多数据库驱动
‌组合模式‌统一处理树形结构的部分-整体关系‌递归组合‌:容器节点(Composite)聚合子组件(Component),递归调用操作文件系统、组织架构、GUI组件树
‌装饰器模式‌动态添加功能,避免子类爆炸‌对象聚合‌:装饰器类聚合原始对象,叠加新行为(如咖啡+牛奶/糖装饰层)流处理(I/O缓冲)、权限校验链
‌外观模式‌简化复杂子系统的调用‌聚合子系统对象‌:外观类组合多个子系统接口,提供统一入口封装SDK、简化API调用
‌享元模式‌减少重复对象创建,节省资源‌共享对象池‌:享元工厂组合共享对象池,复用相同状态(如棋盘中的棋子实例)游戏实体管理、文本编辑器字符池
‌代理模式‌控制对象访问,增强功能‌对象代理‌:代理类聚合真实对象,拦截请求(如延迟加载、权限校验)远程调用、缓存代理、安全控制

2.3.行为型

优化对象间通信与责任分配

模式优化重点典型场景通信/职责特点
观察者模式事件通知机制消息订阅、GUI事件响应一对多广播式通信
中介者模式集中协调多对象交互聊天室、飞机调度系统多对一中介调度
职责链模式动态选择处理者审批流程、异常处理链请求沿链传递,职责动态分配
策略模式算法可替换性支付方式、排序算法切换行为抽象,运行时注入
状态模式状态驱动行为变更订单状态机、游戏角色状态状态转移触发行为更新
命令模式请求封装与生命周期管理操作撤销/重做、任务队列请求对象化,支持存储与回溯

💡 如果本文对你有帮助,点击右上角【订阅专栏】或左上角关注我  
🔔 完整的23中设计模式干货,第一时间推送给你!

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

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

相关文章

React第五十七节 Router中RouterProvider使用详解及注意事项

前言 在 React Router v6.4 中&#xff0c;RouterProvider 是一个核心组件&#xff0c;用于提供基于数据路由&#xff08;data routers&#xff09;的新型路由方案。 它替代了传统的 <BrowserRouter>&#xff0c;支持更强大的数据加载和操作功能&#xff08;如 loader 和…

Opencv中的addweighted函数

一.addweighted函数作用 addweighted&#xff08;&#xff09;是OpenCV库中用于图像处理的函数&#xff0c;主要功能是将两个输入图像&#xff08;尺寸和类型相同&#xff09;按照指定的权重进行加权叠加&#xff08;图像融合&#xff09;&#xff0c;并添加一个标量值&#x…

C++ 基础特性深度解析

目录 引言 一、命名空间&#xff08;namespace&#xff09; C 中的命名空间​ 与 C 语言的对比​ 二、缺省参数​ C 中的缺省参数​ 与 C 语言的对比​ 三、引用&#xff08;reference&#xff09;​ C 中的引用​ 与 C 语言的对比​ 四、inline&#xff08;内联函数…

关于面试找工作的总结(四)

不同情况下收到offer后的处理方法 1.不会去的,只是面试练手2.还有疑问,考虑中3.offer/职位不满足期望的4.已确认,但又收到更好的5.还想挽回之前的offer6.确认,准备入职7.还想拖一下的1.不会去的,只是面试练手 HR您好,非常荣幸收到贵司的offer,非常感谢一直以来您的帮助,…

什么是高考?高考的意义是啥?

能见到这个文章的群体&#xff0c;应该都经历过高考&#xff0c;突然想起“什么是高考&#xff1f;意义何在&#xff1f;” 一、高考的定义与核心功能 **高考&#xff08;普通高等学校招生全国统一考试&#xff09;**是中国教育体系的核心选拔性考试&#xff0c;旨在为高校选拔…

L1和L2核心区别 !!--part 2

哈喽&#xff0c;我是 我不是小upper~ 昨天&#xff0c;咱们分享了关于 L1 正则化和 L2 正则化核心区别的精彩内容。今天我来进一步补充和拓展。 首先&#xff0c;咱们先来聊聊 L1 和 L2 正则化&#xff0c;方便刚接触的同学理解。 L1 正则化&#xff08;Lasso&#xff09;&…

字节推出统一多模态模型 BAGEL,GPT-4o 级的图像生成能力直接开源了!

字节推出的 BAGEL 是一个开源的统一多模态模型&#xff0c;他们直接开源了GPT-4o级别的图像生成能力。&#xff08;轻松拿捏“万物皆可吉卜力”玩法~&#xff09;。可以在任何地方对其进行微调、提炼和部署&#xff0c;它以开放的形式提供与 GPT-4o 和 Gemini 2.0 等专有系统相…

互联网大厂Java面试:从Spring Cloud到Kafka的技术考察

场景&#xff1a;互联网大厂Java求职者面试 面试官与谢飞机的对话 面试官&#xff1a;我们先从基础开始&#xff0c;谢飞机&#xff0c;你能简单介绍一下Java SE和Java EE的区别吗&#xff1f; 谢飞机&#xff1a;哦&#xff0c;这个简单。Java SE是标准版&#xff0c;适合桌…

18-Oracle 23ai JSON二元性颠覆传统

在当今百花齐放的多模型数据库时代&#xff0c;开发人员常在关系型与文档型数据库间艰难取舍。Oracle Database 23ai推出的JSON关系二元性&#xff08;JSON Relational Duality&#xff09;​​ 和二元性视图&#xff08;Duality Views&#xff09;​​ 创新性地统一了两者优势…

蓝桥杯 冶炼金属

原题目链接 &#x1f527; 冶炼金属转换率推测题解 &#x1f4dc; 原题描述 小蓝有一个神奇的炉子用于将普通金属 O O O 冶炼成为一种特殊金属 X X X。这个炉子有一个属性叫转换率 V V V&#xff0c;是一个正整数&#xff0c;表示每 V V V 个普通金属 O O O 可以冶炼出 …

DreamO字节开源图像编辑框架

DreamO是由字节跳动联合北京大学深圳研究生院电子与计算机工程学院共同研发的统一图像定制生成框架&#xff0c;支持多样化的编辑任务。 看下介绍的核心功能&#xff0c;还是很厉害的&#xff0c;今天咱们来体验下。 有正常本地部署版的。 https://github.com/bytedance/Drea…

EM储能网关ZWS智慧储能云应用(11) — 一级架构主从架构

ZWS智慧储能云针对储能场景下不同的架构体系进行了兼容&#xff0c;可以适配用户面临的复杂现场环境&#xff0c;满足更深层次的管理和维护需求。 简介 储能系统包含PCS、BMS、EMS等多个组件&#xff0c;不同储能架构管理和决策方式也有不同。为了适配用户面临的复杂现场环境&…

从0开始一篇文章学习Nginx

Nginx服务 HTTP介绍 ## HTTP协议是Hyper Text Transfer Protocol&#xff08;超文本传输协议&#xff09;的缩写,是用于从万维网&#xff08;WWW:World Wide Web &#xff09;服务器传输超文本到本地浏览器的传送协议。 ## HTTP工作在 TCP/IP协议体系中的TCP协议上&#…

Linux应用开发之网络套接字编程(实例篇)

服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …

Python SQLModel 简介

销量过万TEEIS德国护膝夏天用薄款 优惠券冠生园 百花蜂蜜428g 挤压瓶纯蜂蜜巨奇严选 鞋子除臭剂360ml 多芬身体磨砂膏280g健70%-75%酒精消毒棉片湿巾1418cm 80片/袋3袋大包清洁食品用消毒 优惠券AIMORNY52朵红玫瑰永生香皂花同城配送非鲜花七夕情人节生日礼物送女友 热卖妙洁棉…

【Post-process】【VBA】ETABS VBA FrameObj.GetNameList and write to EXCEL

ETABS API实战:导出框架元素数据到Excel 在结构工程师的日常工作中,经常需要从ETABS模型中提取框架元素信息进行后续分析。手动复制粘贴不仅耗时,还容易出错。今天我们来用简单的VBA代码实现自动化导出。 🎯 我们要实现什么? 一键点击,就能将ETABS中所有框架元素的基…

springboot根据部署服务器生成机器码+加密生成到期时间授权码设置项目在服务器的到期时间

生成机器码 首先需要在后端写个获取window或linux的机器码&#xff0c;根据CPU序列号和硬盘序列号(Windows)&#xff0c;拼接得到 /*** 操作系统的工具类*/ public class OSUtils {/*** 获取window or linux机器码** return*/public static String getOSNumber() {Map<Str…

Thumb-2指令集及其与STM32的关系

Thumb-2指令集及其与STM32的关系&#xff1a; 1. Thumb-2指令集是什么&#xff1f; 本质&#xff1a;Thumb-2是ARM公司设计的混合指令集架构&#xff0c;首次在ARMv7架构中引入&#xff08;如Cortex-M3/M4/M7&#xff09;。 核心创新&#xff1a; 融合了传统 32位ARM指令&…

Haption 力反馈遥操作机器人:6 自由度 + 低延迟响应,解锁精准远程操控体验

Haption自2001年成立以来&#xff0c;始终专注于力反馈设备与定制化解决方案的设计、研发及销售。作为工业级力反馈技术的先行者&#xff0c;其核心产品以高精度交互与可靠性著称&#xff0c;已与达索系统、空客、Orano 等行业头部企业达成深度合作&#xff0c;业务覆盖工程仿真…

C# ExcelWorksheet 贴图

C# ExcelWorksheet 贴图 在C#中,如果你想在Excel工作表中插入图片(例如,在ExcelWorksheet中贴图),你可以使用ClosedXML或EPPlus这样的库来操作Excel文件。下面我将分别介绍如何使用这两个库来实现这一功能。 使用ClosedXML 首先,确保你已经安装了ClosedXML包。你可以通…