- 核心思想
- 识别代码中稳定的部分和变化的部分,然后通过抽象、封装等手段,将变化隔离出去,从而达到整体的稳定
- 六大原则
- 创建
- 建造模式
- 核心思想:使一个复杂对象的构造和表示分开,相同构造过程可以创建不同表示
- 性能
- 组件协作
- 模板模式
- 继承典型,简单来说就是将相同的代码放在父类,有差异变化的抽象到子类实现
- 数据结构
- 迭代器模式
- 保护聚合数据内部结构,提供简单方法给外部调用内部数据
- 经典案例:Iterator和Iterable
- 为什么不直接实现Iterator?
- 如果arrayList等直接实现,那么不满足单一职责,具有容器相关的操作及遍历功能
- 组合模式
- 将对象的组合模式变成部分-整体,CompositePattern使得用户对单个对象和组合对象的使用具有一致性
- 责任链模式
- 使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递请求,直到有一个对象处理它为止
- 实现方式
- 链表方式+每个Filter内部记录着下一个Filter
- 问题:多个业务都需要操作FilterChain时,会导致Filter下个列表添加到另一个业务的Filter
- 解决方案:Filter只做过滤,FilterChain做过滤和管理,内部新建一个类,每次添加Filter时,包装到此类,防止其他业务交替使用
- 不纯的责任链模式:可以将责任推给下一家且可以最终可以没有人接手。
- 单一职责
- 装饰者模式
- 不改变原先的类,增强其额外的功能。说白了就是写一个增强类
- 接口隔离
- 代理模式
- 动态代理
- JDK动态代理
- 目标接口+Proxy.newProxyInstance
- 本质:在运行时创建$Proxy0对象增强类,运行时的产物
- CGLib代理
- 实现接口MethodInterceptor+Enhancer
- 适配器模式
- 将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。
- 典型:FutureTask和Runnable,RunnableAdapter
- 行为变化
- 命令模式
- 将一个请求封装成一个对象,从而使您可以用不同的请求对客户进行参数化,对请求排队或记录请求日志,并支持可撤销的操作。
- 典型:继承Thread方法实现run方法 ->实现Runnable接口传入Thread类中->从而实现发送者和接收者之间解耦
- 访问者模式
- 在不破坏元素内部结构时,通过向元素内部植入接口操作,从而实现此接口,以重载的方式识别不同的元素对其功能进行扩长
- 状态变化
- 状态模式
- 案例:贩卖机
- State接口(进行状态切换)+贩卖机Machine
- State接口+ 贩卖机Machine控制状态切换
- 备忘录模式
- 在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态。
- 领域问题
- 解释器模式
- 给定一个语言,定义它的文法的一种表示,并定义一种解释器,这个解释器使用该表示来解释语言中的句子
- 其他模式
- 空指针模式
- 通过接口实现一个无任何的实现方法,避免null报错
- 懒加载模式
- 推迟对象的创建或者某些操作的执行,来一定程度避免资源消耗
- Saga模式
- Saga是一种分布式事务的模式,它包含一系列事务步骤,这些步骤被设计成可以被单独执行或者回滚。这些事务步骤可以异步执行,它们之间通过一系列的补偿机制(Compensation)来确保系统的一致性。