🏗️ Java 结构型设计模式 总结对比
结构型模式的核心是 —— 如何组合类和对象形成更大的结构,同时保证灵活性和可维护性。
🧱 一张总览表
| 模式名 |
目的 |
关注点(关键思想) |
应用典型场景 |
| 适配器 |
让接口不兼容的类能协同工作 |
接口转换(旧接口变新接口) |
老系统接入新接口、统一三方回调格式 |
| 桥接 |
分离抽象和实现,解耦两者关系 |
抽象与实现分离 |
多维变化(如 支付方式 × 渠道) |
| 装饰器 |
给对象动态添加新功能,不改原类 |
功能增强,类似“包裹” |
Java I/O、权限增强、日志增强等 |
| 代理 |
控制对对象的访问,增加额外控制行为 |
中间人 控制访问 |
权限校验、远程调用、懒加载、日志、安全控制等 |
| 外观 |
简化多个子系统的调用,提供统一入口 |
隐藏内部复杂性,简洁对外接口 |
Controller 调用多个 Service、微信SDK封装等 |
| 组合 |
对象组成树形结构,统一操作叶子与容器对象 |
部分-整体统一处理 |
文件夹结构、UI组件树、组织架构 |
| 享元 |
大量对象共享内部状态,节省内存 |
状态共享,分离内部/外部状态 |
字体/图标/棋子/连接池/缓存对象/字符串池等 |
🧠 分类与对比(图解思路)
1 2 3 4 5 6 7
| [ 适配器 ] - 解决接口不兼容问题,桥接新旧系统 [ 桥 接 ] - 拆分维度,解耦抽象与实现 [ 装饰器 ] - 扩展功能,用“叠加方式”增强行为 [ 代 理 ] - 控制访问,加权限、日志、安全 [ 外 观 ] - 简化子系统调用,对外暴露统一接口 [ 组 合 ] - 树形结构,统一处理叶子和容器 [ 享 元 ] - 共享对象状态,提升性能,省内存
|
🤔 它们的区别和适用场景?
| 模式对比 |
区别点说明 |
举例场景 |
| 适配器 vs 装饰器 |
适配器是接口不一致,装饰器是功能增强 |
微信 vs 支付宝回调参数 → 适配器;接口加日志 → 装饰器 |
| 装饰器 vs 代理 |
装饰器主要是业务增强(关注功能),代理是访问控制(权限/缓存) |
装饰器 → 增强功能,代理 → 拦截权限 |
| 外观 vs 代理 |
外观是简化接口(主动),代理是控制访问(附加逻辑) |
外观:提供一站式服务;代理:限制操作入口 |
| 桥接 vs 组合 |
桥接是多维度解耦(两个变化维度),组合是层级结构统一处理 |
支付 × 支付方式(桥接),菜单树结构(组合) |
| 享元 vs 单例 |
享元是多个共享实例(池),单例是全局唯一实例 |
棋盘多个棋子共享一个对象(享元);全局配置中心(单例) |
🧩 一个形象的比喻
| 模式 |
类比到公司中 |
| 适配器 |
翻译员(让说不同语言的人能沟通) |
| 桥接 |
部门架构(前台和后台分工,互不影响) |
| 装饰器 |
装饰师(在不动房子结构的前提下增加装修) |
| 代理 |
秘书(代替老板接电话,加过滤) |
| 外观 |
前台小姐姐(你不需要了解公司结构,统一接待入口) |
| 组合 |
组织结构图(员工、部门、公司都统一按组织节点操作) |
| 享元 |
复印模板(每次只填变的部分,模板共享) |
✅ 总结一句话记忆法(口诀)
适配接口通,桥接解耦清,装饰加功能,代理控访问,外观门面精,组合统一形,享元省内存。