自学教程 学编程从这里开始

设计模式简介

一、什么是设计模式

设计模式(Design Pattern) 是面向对象软件开发中,针对反复出现的问题,总结出来的一套成熟、可复用的设计方案。

它不是现成框架,也不是可以直接复制粘贴的代码片段,而是一套设计思想。
早在1994年,GoF(Gang of Four,四人帮)合著《设计模式:可复用面向对象软件的基础》,整理了23种经典面向对象设计模式,也就是我们常说的 GoF 23种设计模式。

简单类比:
设计模式就像建筑行业的标准施工图。建筑师遇到阳台、拱门、承重墙这类常见场景,不需要每次从零构思,直接参考成熟方案。程序员遇到对象创建、类组装、对象交互等通用问题,同样可以参考设计模式来设计代码结构。

使用设计模式的目标:

  • 降低代码耦合度
  • 提升代码复用性
  • 增强程序可扩展性
  • 方便后续维护与团队协作

⚠️ 重要提醒:设计模式不是银弹,不能解决所有问题。简单业务强行套用模式,反而会造成过度设计,增加代码复杂度。

二、面向对象六大设计原则

六大原则是设计模式的底层指导思想,所有设计模式都是为了尽可能满足这些原则,实际开发中需要权衡取舍。

  1. 开闭原则(Open Closed Principle,OCP)

对扩展开放,对修改关闭。
新增功能尽量不要修改原有稳定代码,通过扩展方式实现新逻辑,减少线上代码改动带来的风险。

  1. 里氏替换原则(Liskov Substitution Principle,LSP)

子类可以替换父类,且不破坏原有业务。
继承关系需要谨慎设计,子类不能重写父类核心逻辑,避免继承滥用。

  1. 依赖倒置原则(Dependence Inversion Principle,DIP)

高层模块、低层模块都依赖抽象,不依赖具体实现。
面向接口编程,而不是面向具体类编程,方便替换底层实现、单元测试。

  1. 接口隔离原则(Interface Segregation Principle,ISP)

客户端不应该依赖它不需要的接口。
拆分庞大臃肿的接口,使用多个细粒度小接口,避免类被迫实现无用方法。

  1. 迪米特法则(Law of Demeter,LoD)

最少知道原则。一个对象尽量少了解其他对象内部细节,只和直接朋友通信,减少依赖。

  1. 合成复用原则(Composite Reuse Principle,CRP)

优先使用组合/聚合实现复用,少用继承。
继承属于强耦合;组合更加灵活,运行时可以动态替换成员对象。

三、GoF 23种设计模式三大分类

按照模式的关注点,分为创建型、结构型、行为型三类。

✅ 创建型模式(5种)

关注点:对象的创建。把对象创建逻辑和业务使用代码分离,屏蔽对象实例化细节。

  • 单例模式
  • 工厂方法模式
  • 抽象工厂模式
  • 建造者模式
  • 原型模式

✅ 结构型模式(7种)

关注点:类与对象的组合装配,通过组合不同对象构建更强大的功能。

  • 适配器模式
  • 桥接模式
  • 组合模式
  • 装饰器模式
  • 外观模式
  • 享元模式
  • 代理模式

✅ 行为型模式(11种)

关注点:对象之间的交互与职责划分,处理算法、流程、消息传递等行为。

  • 责任链模式
  • 命令模式
  • 解释器模式
  • 迭代器模式
  • 中介者模式
  • 备忘录模式
  • 观察者模式
  • 状态模式
  • 策略模式
  • 模板方法模式
  • 访问者模式

四、什么时候适合使用设计模式

✅ 适合场景

  • 模块功能未来需要频繁扩展
  • 组件需要多种实现,可以动态切换
  • 代码耦合严重,维护成本高
  • 团队多人协作,需要统一代码设计思路
  • 阅读主流框架源码(Spring、MyBatis等)

❌ 不适合场景

  • 一次性简单脚本,写完很少改动
  • 需求极不稳定,频繁推翻重构
  • 简单逻辑,引入模式会增加大量抽象类、接口

五、学习设计模式常见误区

  1. ❌ 死记硬背UML图和定义,不理解解决什么问题
  2. ❌ 写代码先想“我要用哪个模式”,为了套模式而写代码
  3. ❌ 认为设计模式可以完全消除所有if-else
  4. ✅ 正确思路:先发现代码痛点,再考虑是否引入对应模式
  5. ✅ 结合框架源码学习,观察框架中是如何落地设计模式

0 条笔记