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

一.设计模式的基本概念

一.核心概念

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

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

相关文章:

  • Python训练营打卡day46
  • 基于Scala实现Flink的三种基本时间窗口操作
  • 微软PowerBI考试 PL300-使用适用于 Power BI 的 Copilot 创建交互式报表
  • AI书签管理工具开发全记录(十五):TUI基本逻辑实现与数据展示
  • 理解 RAG_HYBRID_BM25_WEIGHT:打造更智能的混合检索增强生成系统
  • 使用 C++/OpenCV 创建动态流星雨特效 (实时动画)
  • PyTorch 中cumprod函数计算张量沿指定维度的累积乘积详解和代码示例
  • 常用函数库之 - std::function
  • 计算机操作系统(十五)死锁的概念与死锁的处理方法
  • 轮廓上距离最大的两个点
  • 温控加热电路【比较器输出作为MOS开关】
  • Python Copilot【代码辅助工具】 简介
  • C++修炼:C++11(二)
  • 鸿蒙仓颉语言开发实战教程:商城应用个人中心页面
  • 数 据 结 构 进 阶:哨 兵 位 的 头 结 点 如 何 简 化 链 表 操 作
  • conda环境配置(二) —— 报错
  • Macbook M3 使用 VMware Fusion 安装 openEuler24.03LTS
  • 性能测试-jmeter实战2
  • ​React Hooks 的闭包陷阱问题
  • 【看到哪里写到哪里】C的“数组指针”
  • 教人怎么做网页的网站/成都网络营销公司
  • 男生可以做网站编辑工作吗/谷歌 翻墙入口
  • 给素材网站做签约设计不想做了/1元购买域名
  • 网站建设管理软件/windows优化大师是自带的吗
  • 搜索引擎和浏览器/河南郑州网站推广优化外包
  • 吉林省城乡建设部网站/济南seo优化