设计原则与设计模式总结

一、设计原则

(一)核心思想

所有设计原则围绕高内聚、低耦合展开,最终目标是让代码易理解、易扩展、易维护。高内聚指模块内部元素关联紧密,专注单一功能;低耦合指模块间依赖度低,仅通过接口交互。

(二)七大原则

  1. 单一职责原则(SRP)

    • 定义:一个类仅有一个引起它变化的原因,即只负责一项职责。
    • 核心作用:降低类的复杂度,减少需求变更带来的影响,便于代码复用与组合。
    • 记忆口诀:“一职一类”
    • 应用场景:如学生管理系统中,学生实体类仅负责存储学生信息,学生业务类负责处理学生相关业务逻辑。
  2. 开闭原则(OCP)

    • 定义:软件实体对扩展开放,对修改关闭。
    • 核心作用:通过新增代码实现功能扩展,避免修改原有稳定代码,降低需求变动风险,减少维护成本。
    • 记忆口诀:“扩开改关”
    • 应用场景:电商系统新增促销活动时,通过新增促销策略类实现,而非修改原有价格计算逻辑。
  3. 里氏替换原则(LSP)

    • 定义:所有引用基类对象的地方,都能透明地使用其子类对象,子类可在任何场景替代父类且不改变程序逻辑。
    • 核心作用:保障继承体系的稳定性,支持多态复用,是实现代码灵活扩展的基础。
    • 记忆口诀:“子类代父类,逻辑不改变”
    • 应用场景:在图形绘制系统中,圆形、矩形等子类可替代图形父类对象进行绘制操作。
  4. 依赖倒置原则(DIP)

    • 定义:上层模块不依赖下层模块,细节依赖抽象,两者都应依赖抽象。
    • 核心作用:降低模块间耦合,提升系统扩展性,便于替换具体实现。
    • 记忆口诀:“依赖抽象,而非具体”
    • 应用场景:业务层依赖数据访问层的抽象接口,而非具体的数据库实现类,方便切换不同数据库。
  5. 接口隔离原则(ISP)

    • 定义:用多个小接口替代一个大接口,避免接口包含冗余方法。
    • 核心作用:减少接口依赖,降低类的实现成本,提高代码灵活性。
    • 记忆口诀:“小接口,低依赖”
    • 应用场景:将包含多种功能的用户接口拆分为登录接口、注册接口、信息查询接口等。
  6. 迪米特法则(LOD)

    • 定义:一个实体应尽量少与其他实体发生相互作用,即最少知道原则。
    • 核心作用:降低系统复杂度,减少模块间交互成本,提高模块独立性。
    • 记忆口诀:“少交互,低耦合”
    • 应用场景:订单类只需调用库存服务类的接口,无需了解库存服务类内部的具体实现细节。
  7. 合成复用原则(CRP)

    • 定义:尽量使用合成/聚合的方式实现代码复用,而非继承。
    • 核心作用:避免继承带来的高耦合问题,提高代码灵活性与可维护性。
    • 记忆口诀:“合成聚合优,继承慎用之”
    • 应用场景:汽车类通过聚合发动机类、轮胎类等实现功能,而非继承这些类。

二、设计模式

(一)核心定义

设计模式是一套被反复使用、经过分类编目的代码设计经验总结,本质是设计原则的具体实践,旨在实现代码可重用、易理解、高可靠。

(二)三大分类及常见模式

1. 创建型模式(聚焦对象创建)

核心作用是分离对象的创建与使用,简化对象创建过程。

  • 单例模式
    • 定义:保证一个类仅有一个实例,并提供全局访问点。
    • 核心作用:避免频繁创建与销毁对象,节省系统资源,确保全局状态一致性。
    • 记忆口诀:“单例唯一,全局访问”
    • 应用场景:全局配置类、数据库连接池、日志对象等。
    • 实现方式:饿汉式(线程安全、无懒加载,易浪费内存)、懒汉式(支持懒加载,多线程需双重锁定或静态内部类保证安全)。
  • 工厂模式
    • 定义:创建对象时不暴露创建逻辑,通过共同接口指向新创建对象,包括简单工厂、工厂方法、抽象工厂。
    • 核心作用:解耦对象创建与使用,便于扩展不同产品实例。
    • 记忆口诀:“工厂创建,逻辑隐藏”
    • 应用场景:日志记录器根据不同条件创建不同类型的日志对象;数据库访问层根据配置创建不同数据库连接对象。
  • 建造者模式
    • 定义:将复杂对象的构建过程分解为多个简单步骤,逐步构建复杂对象。
    • 核心作用:分离对象构建与表示,灵活构建不同配置的复杂对象。
    • 记忆口诀:“分步构建,复杂对象”
    • 应用场景:创建包含多个部件的电脑对象,可按不同配置逐步组装。

2. 结构型模式(处理类/对象组合)

核心作用是优化类与对象的组合方式,提高系统灵活性与可扩展性。

  • 适配器模式
    • 定义:将一个类的接口转换为客户端期望的另一种接口,使不兼容的类能够协作。
    • 核心作用:解决接口不兼容问题,复用现有类。
    • 记忆口诀:“接口适配,兼容协作”
    • 应用场景:在新系统中复用旧系统的类,通过适配器转换接口;不同格式的数据读取,通过适配器统一读取接口。
  • 装饰器模式
    • 定义:动态地给对象添加额外职责,不改变对象原有结构。
    • 核心作用:灵活扩展对象功能,避免继承带来的类爆炸问题。
    • 记忆口诀:“动态装饰,功能扩展”
    • 应用场景:给咖啡添加牛奶、糖等配料,通过装饰器动态扩展咖啡功能。
  • 代理模式
    • 定义:通过代理对象控制对真实对象的访问。
    • 核心作用:实现访问控制、增强功能(如日志、事务、安全等)。
    • 记忆口诀:“代理控制,增强访问”
    • 应用场景:Spring AOP通过动态代理实现事务管理、日志记录等横切关注点;远程代理实现远程对象访问。

3. 行为型模式(处理对象间协作)

核心作用是规范对象间的通信与协作方式,提高系统灵活性与可维护性。

  • 策略模式
    • 定义:定义一系列算法,将每个算法封装起来,使它们可相互替换。
    • 核心作用:动态切换算法,避免大量条件判断。
    • 记忆口诀:“算法封装,动态切换”
    • 应用场景:电商系统根据不同促销活动切换不同的价格计算策略。
  • 观察者模式
    • 定义:定义对象间的一对多依赖关系,当一个对象状态改变时,其依赖者都能收到通知并自动更新。
    • 核心作用:实现对象间的松耦合通信,便于扩展观察者。
    • 记忆口诀:“一对多,状态变,通知更”
    • 应用场景:消息订阅系统,订阅者关注主题,主题状态变化时通知所有订阅者。
  • 模板方法模式
    • 定义:定义算法骨架,将步骤延迟到子类实现。
    • 核心作用:复用通用算法逻辑,子类专注实现差异化步骤。
    • 记忆口诀:“骨架定义,步骤延迟”
    • 应用场景:Spring的JdbcTemplate封装数据库操作通用流程,用户只需实现具体的结果映射逻辑。

三、记忆技巧总结

(一)设计原则记忆

  • 英文首字母记忆:单一职责(S)、开闭(O)、里氏替换(L)、接口隔离(I)、依赖倒置(D)、迪米特(L)、合成复用(C),可简化为“SOILDLC”辅助记忆。
  • 口诀记忆:结合前文各原则的记忆口诀,串联成顺口溜,如“一职一类,扩开改关,子类代父类,依赖抽象,小接口低依赖,少交互低耦合,合成聚合优”。

(二)设计模式记忆

  • 分类记忆:按创建型、结构型、行为型分类,分别记忆各类模式的核心特点与应用场景。
  • 口诀记忆:
    • 创建型:“抽工建单元”(抽象工厂、工厂方法、建造者、单例、原型)
    • 结构型:“与时代相结合,装外向”(适配器、代理、桥接、组合、装饰、外观、享元)
    • 行为型:“责令中介观叠被,防撞车”(责任链、命令、中介者、观察者、迭代器、备忘录、访问者、状态、策略),再加上模板方法模式。
最后编辑于 :
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容