软件设计模式

软件设计模式(Software Design Patterns)是一套被反复验证的、用于解决特定场景下软件设计问题的经验总结。它们是前辈开发者在长期实践中提炼出的最佳实践,旨在提高代码的可复用性、可维护性、可读性和灵活性。

设计模式的核心要素

  1. 名称:简洁描述模式的意图(如单例模式、工厂模式)。
  2. 问题:模式适用的场景和要解决的核心问题。
  3. 解决方案:模式的结构和交互方式(非具体代码,而是通用设计思路)。
  4. 效果:使用模式带来的优缺点(如灵活性提升、复杂度增加等)。

设计模式的三大分类(基于用途)

1. 创建型模式(Creational Patterns)

解决对象创建的问题,隐藏创建逻辑,使代码更灵活。
常见模式:

  • 单例模式(Singleton):确保一个类只有一个实例,并提供全局访问点(如配置管理器)。
  • 工厂模式(Factory) :
    • 简单工厂:通过一个工厂类创建不同类型的对象(如日志工厂生成文件日志/控制台日志)。
    • 工厂方法:将对象创建延迟到子类,每个子类负责一种产品的创建。
    • 抽象工厂:创建一系列相关或依赖的对象(如跨平台UI组件工厂,同时生成按钮、输入框等)。
  • 建造者模式(Builder):分步构建复杂对象(如复杂配置对象的构建,避免多参数构造函数)。
  • 原型模式(Prototype):通过复制现有对象生成新对象(适合创建成本高的场景,如克隆复杂对象)。
2. 结构型模式(Structural Patterns)

处理类或对象的组合,关注对象间的关系,实现灵活的结构。
常见模式:

  • 适配器模式(Adapter):将一个类的接口转换为客户端期望的另一个接口(如旧系统接口适配新接口)。
  • 装饰器模式(Decorator):动态给对象添加功能,不改变其结构(如IO流中的缓冲装饰、日志增强)。
  • 代理模式(Proxy):为对象提供代理,控制访问(如远程代理、缓存代理、权限代理)。
  • 组合模式(Composite):将对象组合成树形结构,统一处理单个对象和组合对象(如文件系统的文件/文件夹)。
  • 外观模式(Facade):为复杂系统提供简化接口(如第三方库的封装层)。
  • 桥接模式(Bridge):将抽象与实现分离,使其可独立变化(如跨平台组件的抽象与不同系统实现分离)。
  • 享元模式(Flyweight):复用大量细粒度对象,减少内存消耗(如文字处理软件的字符缓存)。
3. 行为型模式(Behavioral Patterns)

关注对象间的通信和职责分配,解决交互问题。
常见模式:

  • 观察者模式(Observer):对象间一对多依赖,一个对象变化时通知所有依赖者(如事件监听、消息订阅)。
  • 策略模式(Strategy):定义算法家族,动态切换(如排序算法、支付方式切换)。
  • 模板方法模式(Template Method):父类定义流程骨架,子类实现具体步骤(如框架中的生命周期方法)。
  • 迭代器模式(Iterator) :提供遍历集合的统一接口,无需暴露内部结构(如Java的Iterator)。
  • 命令模式(Command):将请求封装为对象,支持撤销、队列化(如遥控器按钮操作、事务日志)。
  • 状态模式(State):对象状态变化时动态改变行为(如订单状态流转:待支付→已支付→已发货)。
  • 责任链模式(Chain of Responsibility):请求沿处理链传递,直到被处理(如权限校验链、日志过滤链)。
  • 中介者模式(Mediator):用中介者减少对象间的直接耦合(如聊天室的消息中介)。

设计模式的原则(SOLID)

模式的设计基于以下原则,理解原则比死记模式更重要:

  • 单一职责(Single Responsibility):一个类只做一件事。
  • 开放-封闭(Open-Closed):对扩展开放,对修改封闭(通过抽象和多态实现)。
  • 里氏替换(Liskov Substitution):子类可替换父类,不破坏原有逻辑。
  • 接口隔离(Interface Segregation):避免过大接口,客户端只依赖需要的接口。
  • 依赖倒置(Dependency Inversion):依赖抽象,不依赖具体实现(如依赖接口而非具体类)。

何时使用设计模式?

  • 避免过度设计:小项目可能不需要复杂模式,优先保证简洁。
  • 解决特定问题:当代码出现复用性差、耦合高、扩展困难等问题时,引入合适的模式。
  • 团队共识:模式是"通用语言",帮助团队统一设计思路。

设计模式的核心是"理解场景,灵活应用",而非生搬硬套。掌握模式背后的设计思想(如封装变化、依赖抽象),才能真正提升代码质量。

相关推荐
杯子不吃紫菜1 天前
LangGraph 体系实战(下):中断恢复、流式、子图与设计模式
单片机·嵌入式硬件·设计模式
是2的10次方啊1 天前
设计模式与生活⑳:楼里的事都找前台,你就再没见过师傅
设计模式
是2的10次方啊2 天前
设计模式与生活⑲:投影连不上,别急着换投影仪
设计模式
cjz38993 天前
规则树:把一百行if-else拆成一棵树
设计模式
Adellle3 天前
设计模式指南 (Java 版) ㊁
java·开发语言·设计模式
是2的10次方啊3 天前
设计模式与生活⑱:工资还没焐热,账单已经凑成一摞
设计模式
百思不得小李4 天前
一个复杂的动态表单是如何实现的
前端·设计模式
爱你真是太好了4 天前
上下文组成以及如何压缩
设计模式
freejackman4 天前
【工程化】从“单兵作战”到“多引擎架构”:基于门面模式的重构实战
大数据·数据库·hive·sql·测试工具·设计模式·架构
Java成神之路-4 天前
从 if-else 到优雅解耦:策略 / 适配器 / 组合模式全流程实战
设计模式