一.核心概念
对软件设计中重复出现问题的成熟解决方案,提供代码可重用性、可维护性和扩展性保障。核心原则包括:
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事件响应 | 一对多广播式通信 |
中介者模式 | 集中协调多对象交互 | 聊天室、飞机调度系统 | 多对一中介调度 |
职责链模式 | 动态选择处理者 | 审批流程、异常处理链 | 请求沿链传递,职责动态分配 |
策略模式 | 算法可替换性 | 支付方式、排序算法切换 | 行为抽象,运行时注入 |
状态模式 | 状态驱动行为变更 | 订单状态机、游戏角色状态 | 状态转移触发行为更新 |
命令模式 | 请求封装与生命周期管理 | 操作撤销/重做、任务队列 | 请求对象化,支持存储与回溯 |