设计模式分类范围 \ 目的创建型模式结构型模式行为型模式类模式工厂方法模式适配器模式类模板方法模式桥接模式解释器模式对象模式单例模式适配器模式对象责任链模式抽象工厂模式组合模式命令模式建造者模式装饰器模式迭代器模式原型模式外观模式中介者模式享元模式备忘录模式代理模式观察者模式状态模式策略模式访问者模式分类及简介分类模式名称英文原名核心作用创建型单例模式Singleton保证一个类仅有一个实例并提供全局访问点工厂方法模式Factory Method定义创建对象的接口由子类决定实例化哪个类延迟实例化抽象工厂模式Abstract Factory提供一个创建一系列相关或依赖对象的接口无需指定具体类建造者模式Builder将复杂对象的构建与表示分离同一构建过程可创建不同表示原型模式Prototype用原型实例指定创建对象的种类通过复制原型创建新对象避免重复初始化结构型适配器模式Adapter将一个类的接口转换成客户端期望的另一个接口解决接口不兼容问题桥接模式Bridge将抽象部分与它的实现部分分离使两者可独立变化组合模式Composite将对象组合成树形结构以表示 “部分 - 整体” 的层次关系统一对待单个对象和组合对象装饰器模式Decorator动态给对象添加额外职责不改变原类结构比继承更灵活外观模式Facade为子系统提供统一的高层接口简化子系统的使用享元模式Flyweight运用共享技术减少创建对象的数量节省内存针对大量相似对象代理模式Proxy为其他对象提供一种代理以控制对这个对象的访问如远程代理、保护代理行为型责任链模式Chain of Responsibility将请求的发送者和接收者解耦让多个对象都有机会处理请求形成责任链命令模式Command将请求封装成对象使请求的发送者和接收者解耦支持撤销、队列等解释器模式Interpreter定义语言的文法规则并构建解释器来解释该语言的句子适用于简单语法迭代器模式Iterator提供一种方法顺序访问聚合对象的元素而无需暴露聚合对象的内部结构中介者模式Mediator用一个中介对象封装一系列对象的交互减少对象间直接耦合备忘录模式Memento在不破坏封装的前提下捕获对象的内部状态并保存以便后续恢复观察者模式Observer定义对象间的一对多依赖当一个对象状态变化时所有依赖它的对象都得到通知并更新状态模式State允许对象在内部状态变化时改变其行为使对象看起来像改变了类策略模式Strategy定义一系列算法将其封装起来使它们可相互替换算法独立于使用它的客户端模板方法模式Template Method定义一个操作的算法骨架将步骤延迟到子类实现复用骨架定制步骤访问者模式Visitor表示一个作用于某对象结构中的各元素的操作不改变元素类而新增操作面向对象设计原则单一职责原则SRP一个类 / 模块只担一责仅因一种原因变化。开放 - 封闭原则OCP对扩展开放、对修改关闭灵活应对需求变更。里氏替换原则LSP子类可透明替换基类不破坏程序正确性。依赖倒置原则DIP依赖抽象而非具体解耦高低层模块。接口隔离原则ISP拆分臃肿接口客户端仅依赖必需方法。迪米特法则LOD少知少依赖仅与直接关联对象交互。合成复用原则CRP优先组合 / 聚合复用避免继承强耦合。设计原则核心定义核心作用单一职责原则SRP一个类 / 模块只负责一项职责仅有一个引起它变化的原因。降低类的复杂度提高代码复用性、可读性、可维护性减少需求变更时的影响范围避免 “牵一发而动全身”。开放 - 封闭原则OCP软件实体类、模块、函数对扩展开放对修改关闭。支持需求扩展时不修改原有代码降低变更风险提高系统灵活性和可扩展性符合 “增量开发” 理念。里氏替换原则LSP所有引用基类的地方必须能透明地替换为其子类对象且不影响程序正确性。保障继承关系的合理性避免子类破坏基类契约支持多态性安全使用为 OCP 提供基础。依赖倒置原则DIP高层模块不依赖低层模块二者都依赖抽象抽象不依赖细节细节依赖抽象。解耦高层与低层模块提高系统灵活性便于替换低层实现如切换数据库、框架降低耦合度。接口隔离原则ISP客户端不应依赖其不需要的接口一个接口应只包含客户端必需的方法拆分臃肿接口。避免客户端被迫依赖无用方法减少接口冗余降低类与接口的耦合提高代码灵活性和复用性。迪米特法则LOD一个对象应尽可能少地了解其他对象只与直接朋友交互“朋友” 指直接关联的对象。减少对象间的耦合降低系统复杂度提高模块独立性便于维护和扩展降低 “牵一发而动全身” 的风险。合成复用原则CRP优先使用组合 / 聚合关系复用代码而非继承继承仅用于 “is-a” 关系组合用于 “has-a” 关系。避免继承带来的强耦合子类依赖父类实现提高代码灵活性可动态组合不同功能模块符合 OCP。依赖倒置原则实现方法定义抽象层接口 / 抽象类提取低层模块的核心行为抽象为接口或抽象类明确高层与低层的交互契约不包含具体实现。高层模块依赖抽象高层模块仅引用上述抽象层不直接依赖低层模块的具体类通过抽象调用功能。低层模块实现抽象 依赖注入低层模块实现抽象层接口通过构造函数注入、Setter 注入等方式将低层实例传递给高层而非高层主动创建低层对象。迪米特法则的实现方法只与直接朋友交互仅依赖直接关联对象成员变量、方法参数 / 返回值避免访问 “朋友的朋友”。隐藏内部结构通过封装屏蔽对象内部细节如私有成员、不暴露内部集合不对外提供不必要的访问接口。减少公共方法仅暴露必要的公共 API避免无关对象通过公共方法获取冗余信息。引入中介解耦多对象复杂交互时用中介类封装交互逻辑避免对象间直接交叉依赖。主题扩展与复用第二次软件危机解决什么问题将软件从 “手工作坊式” 的无序开发转变为 “工程化、规范化、可预测” 的工业化生产解决大型复杂软件的 “质量不可控、进度超期、成本失控” 三大痛点。软件设计模式的概念和意义概念软件设计模式是对软件开发中重复出现的设计问题的标准化解决方案是经实践验证的、可复用的设计经验总结包含特定场景、问题、解决方案及效果聚焦 “如何合理组织类 / 对象、解决耦合与扩展问题”。意义复用成熟经验减少重复设计与试错成本降低系统复杂度解耦模块 / 对象提升可维护性增强代码可读性与规范性便于团队协作统一设计语言支持需求扩展提高系统灵活性与可扩展性适配未来变更。设计模式的分类根据目的创建型模式描述怎样创建对象特点是将对象的使用和创建分离原型单例工厂方法抽象工厂建造者。结构性模式描述如何将类或对象按照某种布局组成更大的结构代理适配器桥接装饰外观享元组合等。行为型模式描述类或对象之间怎样相互协作共同完成单个对象无发单独完成的任务以及怎样分配职责模板方法策略命令指责链状态观察者中介者迭代器访问者备忘录解释器等。根据作用范围类模式用于处理类与子类之间的关系这些关系是通过继承来实现的是静态的工厂方法适配器模板方法解释器。对象模式除类模式以外所有。类图统一建模语言图构成的设计语言。类之间的关系关系类型简要叙述继承Generalization子类继承父类属性与方法is-a 关系实现代码复用支持多态。组合Composition整体包含部分部分生命周期与整体绑定不可独立存在has-a 强关联。聚合Aggregation整体包含部分部分可独立存在has-a 弱关联如 “团队 - 成员”。依赖Dependency一个类使用另一个类的功能临时关联如 “工具类 - 业务类”耦合度最低。实现Realization类实现接口的抽象方法接口定义契约类提供具体实现。关联Association类之间的长期引用关系无明确强弱如 “用户 - 订单”可细分为单向 / 双向。关联聚合组合的区别关联只是 “认识”相互引用无归属聚合是 “聚在一起”部分可独立如员工可离开公司组合是 “不可分割”部分是整体的一部分如心脏不能脱离人体存在。单例模式特点类仅允许创建一个实例提供全局唯一访问点如getInstance()方法自行控制实例创建过程禁止外部通过new实例化。懒汉式饿汉式类型核心逻辑关键特点懒汉式延迟实例化类加载时不创建实例首次调用访问方法如getInstance()时才创建。优点节省内存按需创建缺点需处理线程安全问题未加锁可能创建多个实例有一定性能开销。饿汉式预加载实例类加载时就完成实例创建后续访问直接返回已创建的实例。优点实现简单、天然线程安全类加载由 JVM 保证唯一缺点浪费内存无论是否使用都会创建实例。原型模式定义用原型实例指定创建对象的种类通过复制克隆原型对象快速创建新对象避免重复初始化提高创建效率。深克隆浅克隆的实现类型核心逻辑实现方式浅克隆仅复制对象本身及基本数据类型成员引用类型成员仅复制引用共享原对象的引用数据。1. 多数语言默认克隆如 JavaCloneable接口重写clone()2. 序列化简单拷贝引用。深克隆完全复制对象及所有成员包括引用类型成员的底层数据新对象与原对象完全独立。1. 递归克隆所有引用类型成员2. 序列化对象后再反序列化如 JavaSerializable3. 工具类拷贝如 Apache BeanUtils。工厂方法模式优点解耦对象创建与使用客户端无需关注具体实例化逻辑符合开闭原则新增产品只需扩展工厂子类无需修改原有代码提高代码复用性集中管理同类产品创建逻辑支持多态客户端通过统一接口调用不同产品灵活性强。抽象工厂模式建造者模式定义将复杂对象的构建过程与表示分离通过建造者类分步构建对象部件同一构建流程可生成不同表示的复杂对象。优缺点优点缺点解耦构建与表示灵活定制对象部件组合结构较复杂增加额外建造者、指挥者类分步构建复杂对象逻辑清晰易维护仅适用于 “部件固定、组合多变” 的复杂对象便于扩展新的构建方案符合开闭原则简单对象使用时冗余度高、性价比低隔离复杂对象的创建细节客户端无需关注构建顺序代理模式静态代理动态代理类型简介实现方式简要静态代理编译期确定代理类与目标类关系代理类手动编写与目标类实现同一接口 / 继承同一父类。1. 定义共同接口或父类2. 目标类实现接口3. 代理类实现接口持有目标类实例在方法中调用目标方法并增强。动态代理运行时动态生成代理类无需手动编写代理代码适配任意目标类接口 / 类。1. 接口动态代理如 Java JDK Proxy通过Proxy.newProxyInstance()InvocationHandler拦截方法2. 类动态代理如 CGLIB通过字节码技术生成目标类子类作为代理重写方法增强。适配器模式应用场景适配器模式的核心是解决「接口不兼容」问题以下是其典型应用场景集成 legacy 系统旧系统接口与新系统不匹配需适配后复用旧功能无需修改旧代码第三方组件适配引入的开源库 / SDK 接口与项目现有接口规范不一致通过适配器统一调用方式多版本接口兼容同一功能存在多版本接口如 v1/v2用适配器封装差异客户端无感知切换重构兼容过渡系统重构后接口变更用适配器兼容未改造的旧客户端代码平滑过渡跨框架 / 跨语言交互不同框架如 Spring 与自研框架或语言如 Java 与 Python 服务的接口格式差异通过适配器转换数据格式与调用方式。桥接模式特点分离抽象与实现抽象部分业务逻辑和实现部分底层实现独立拆分互不依赖双向独立扩展抽象层与实现层可各自通过子类独立扩展不影响对方降低耦合用组合替代继承避免抽象与实现绑定导致的类爆炸统一接口抽象层定义统一接口客户端无需关注底层实现细节。结构与实现1. 核心结构4 个角色抽象化角色Abstraction定义抽象业务逻辑持有实现化角色的引用扩展抽象化角色RefinedAbstraction抽象化角色的子类扩展业务逻辑实现化角色Implementor定义底层实现的接口与抽象化角色解耦具体实现化角色ConcreteImplementor实现 Implementor 接口提供具体功能。2. 实现步骤定义实现化接口Implementor封装底层具体功能编写多个具体实现类ConcreteImplementor实现不同的底层逻辑定义抽象化类Abstraction持有 Implementor 引用定义业务方法编写扩展抽象类RefinedAbstraction继承 Abstraction扩展业务逻辑客户端通过抽象化类或其子类调用动态绑定不同的实现类实现功能组合。装饰模式扩展透明半透明装饰器装饰模式的核心是动态给对象添加额外职责且不改变原类结构。透明与半透明装饰器的核心区别的是「是否遵循 “里氏替换原则”」「客户端是否感知装饰器存在」具体扩展如下类型核心定义关键特点适用场景透明装饰器装饰器与被装饰对象实现同一接口 / 继承同一父类仅增强功能不新增方法客户端无感知装饰器。1. 遵循里氏替换原则可无缝替换被装饰对象2. 装饰器仅扩展原有方法逻辑不暴露新 API3. 客户端通过统一接口调用无需区分原对象与装饰对象。需纯粹增强功能、不改变调用方式如给接口统一加日志、缓存。半透明装饰器装饰器在增强原有功能的同时新增了独有的方法客户端需感知装饰器并调用新方法。1. 打破里氏替换原则装饰器不能完全替代被装饰对象2. 扩展能力更强可新增业务逻辑3. 客户端需显式声明装饰器类型才能调用新增方法。观察者模式观察者模式核心是「定义对象间一对多依赖当主题状态变化时所有依赖的观察者自动收到通知并更新」解耦主题与观察者。一、核心结构4 个角色角色职责描述主题Subject维护观察者列表提供「注册、移除观察者」及「通知所有观察者」的统一接口。具体主题ConcreteSubject主题的实现类存储实际状态状态变化时调用通知方法触发观察者更新。观察者Observer定义接收通知的接口如update()方法供主题回调。具体观察者ConcreteObserver观察者的实现类实现update()方法持有主题引用可选接收通知后执行具体业务逻辑。二、实现步骤简要定义观察者接口Observer声明update()方法接收主题状态或通知参数定义主题接口Subject声明register(Observer)、remove(Observer)、notifyObservers()方法实现具体主题ConcreteSubject维护观察者集合状态变更时遍历集合调用所有观察者的update()实现具体观察者ConcreteObserver实现update()方法处理主题通知如更新自身状态、执行业务操作客户端调用创建主题与观察者实例将观察者注册到主题通过修改主题状态触发通知。关键要点主题仅依赖观察者接口不依赖具体实现符合依赖倒置原则支持动态注册 / 移除观察者扩展灵活符合开闭原则通知方式可灵活实现如推模式主题主动传状态拉模式观察者主动获取状态。职责链模式主要优点解耦请求发送者与接收者发送者无需知道哪个接收者处理请求接收者也无需知晓请求来源降低耦合灵活调整责任链可动态增删、调整接收者顺序适配不同业务场景扩展性强单一职责每个接收者仅关注自身职责范围内的请求处理逻辑清晰易维护简化对象交互避免发送者与多个接收者直接关联减少对象间依赖关系支持请求多级处理请求可沿链传递实现多步骤、分层处理如审批流程。策略模式策略模式核心是「定义一系列算法封装为独立策略类使其可相互替换算法独立于使用它的客户端」解决 “多重条件判断” 问题。一、核心结构3 个角色角色职责描述策略接口Strategy定义所有策略的统一接口声明算法核心方法如execute()。具体策略ConcreteStrategy实现策略接口封装具体算法逻辑如不同排序算法、支付方式。上下文Context持有策略接口引用提供统一入口供客户端调用负责策略的切换与执行不依赖具体策略实现。二、实现步骤简要定义策略接口声明算法核心方法如calculate()「计算」、process()「处理」实现具体策略多个具体策略类实现接口各自封装不同算法逻辑如策略 A、策略 B实现上下文类持有策略接口实例提供「设置策略」如setStrategy()和「执行策略」如doOperation()方法客户端调用创建上下文实例与具体策略实例通过上下文设置策略调用执行方法无需直接操作策略类。关键要点符合开闭原则新增算法只需新增具体策略类无需修改上下文及原有代码消除多重条件判断用 “策略替换” 替代if-else/switch逻辑代码更简洁易维护策略可动态切换客户端可通过上下文实时更换策略适配不同业务场景如支付时切换微信 / 支付宝支付。模板方法模板方法模式核心是「定义算法骨架模板将可变步骤延迟到子类实现」统一算法流程、复用公共逻辑差异化逻辑由子类定制。一、核心结构2 个角色角色职责描述抽象父类AbstractClass定义算法整体骨架模板方法包含「不可变公共步骤」父类实现和「可变抽象步骤」子类实现模板方法通常用final修饰禁止子类修改流程。具体子类ConcreteClass实现抽象父类中的可变抽象步骤定制算法的差异化逻辑不改变算法整体流程。二、实现步骤简要定义抽象父类编写模板方法final修饰按顺序调用算法的各个步骤公共步骤 抽象步骤实现公共步骤固定逻辑如初始化、资源释放声明抽象步骤可变逻辑如核心业务处理由子类实现。实现具体子类继承抽象父类重写所有抽象步骤实现专属业务逻辑。客户端调用创建具体子类实例调用父类的模板方法自动执行完整算法流程公共步骤 子类定制步骤。关键要点复用公共逻辑父类集中管理算法骨架和固定步骤避免子类重复编码控制扩展子类仅能修改抽象步骤无法改变算法整体流程保证一致性符合开闭原则新增算法变体只需新增子类无需修改父类模板扩展灵活。备忘录模式备忘录模式核心是「捕获对象内部状态并保存后续可恢复到该状态」解耦状态保存与对象本身核心包含 3 个角色角色职责描述原发器Originator即状态的拥有者提供「创建备忘录保存当前状态」和「从备忘录恢复状态」的方法自身维护核心业务状态。备忘录Memento存储原发器的内部状态仅暴露有限接口供原发器访问避免外部修改状态通常与原发器耦合紧密。管理者Caretaker负责管理备忘录对象存储、获取不操作或检查备忘录内部状态仅作为 “容器” 转发备忘录。关键关系原发器与备忘录双向依赖原发器创建 / 恢复状态备忘录存储状态管理者与备忘录单向关联管理者仅持有备忘录不感知其内部结构客户端仅与原发器、管理者交互无需直接操作备忘录。模板方法模板方法模式核心是「定义算法固定骨架将可变步骤延迟到子类实现」统一流程、复用公共逻辑差异化逻辑由子类定制。一、核心结构2 个核心角色角色核心职责抽象父类AbstractClass1. 定义算法骨架模板方法用final修饰禁止子类修改流程2. 实现不可变的公共步骤如初始化、资源释放3. 声明可变的抽象步骤由子类实现。具体子类ConcreteClass继承抽象父类仅实现父类声明的抽象步骤定制算法的差异化逻辑不改变整体流程。二、实现步骤3 步极简写抽象父类定义final模板方法按顺序串联步骤实现公共固定步骤声明抽象可变步骤写具体子类继承父类重写抽象步骤实现专属业务逻辑客户端调用创建子类实例直接调用父类模板方法自动执行 “公共步骤 子类定制步骤” 的完整流程。关键要点公共逻辑上移父类集中管理固定流程避免子类重复编码流程不可篡改模板方法final修饰保证所有子类遵循统一流程扩展灵活新增业务变体只需加子类不修改父类符合开闭原则。