常见代码重构技巧( 三 )


建造者
用于创建一种类型的复杂对象,通过设置不同的可选参数进行“定制化”
对象的构造参数较多且多数可选
原型
通过复制已有对象来创建新的对象
对象的创建成本较大且同一类的不同对象之前差别不大
结构型
代理
不改变原始类和不使用继承的情况下,通过引入代理类来给原始类附加功能
增加代理访问,比如监控、缓存、限流、事务、RPC
装饰者
不改变原始类和不使用继承的情况下,通过组合的方式动态扩展原始类的功能
动态扩展类的功能
适配器
不改变原始类的情况下,通过组合的方式使其适配新的接口
复用现有类,但与期望接口不适配
桥接
当类存在多个独立变化的维度时,通过组合的方式使得其可以独立进行扩展
存在多个维度的继承体系时
门面
为子系统中一组接口定义一个更高层的接口,使得子系统更加容易使用
解决接口复用性(细粒度)与接口易用性(粗粒度)的矛盾
组合
将对象组合成树形结构以表示部分-整体的层次结构,统一单个对和组合对象的处理逻辑
满足部分与整体这种树形结构
享元
运用共享技术有效地支持大量细粒度的对象
当系统存在大量的对象,这些对象的很多字段取值范围固定

常见代码重构技巧

文章插图
行为型
观察者
多个观察者监听同一主题对象,当主题对象状态发生变化时通知所有观察者,使它们能够自动更新自己
解耦事件创建者与接收者
模板
定义一个操作中算法的骨架,将某些步骤实现延迟到子类中
解决复用与扩展问题
策略
定义一组算法类,将每个算法分别封装起来,使得它们可以互相替换
消除各种if-else分支判断
解耦策略的定义、创建、使用
状态
允许一个对象在其内部状态改变的时候改变其行为
分离对象的状态与行为
职责链
将一组对象连成一条链,请求沿着该链传递,直到某个对象能够处理它为止
解耦请求的发送者与接收者
迭代器
提供一种方法顺序访问一个集合对象的各个元素,但不暴露该对象的内部表示
解耦集合对象的内部表示与遍历访问
访问者
封装一些作用于某种数据结构中各元素的操作,在不改变数据结构的前提下,定义作用于这些元素的新操作 。
分离对象的数据结构与行为
备忘录
在不违背封装原则的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,以便之后恢复对象为先前的状态
用于对象的备份与恢复
命令
将不同的请求封装成对应的命令对象,对命令的执行进行控制且对使用方透明
用于控制命令的执行,比如异步、延迟、排队、撤销、存储与撤销
解释器
为某个语言定义它的语法表示,并定义一个解释器来处理这个语法
用于编译器、规则引擎、正则表达式等特定场景
中介
定义一个单独的中介对象,来封装一组对象之间的交互,避免对象之间的直接交互
使各个对象不需要显式地相互引用,从而使其耦合松散
代码分层
模块结构说明
代码开发要遵守各层的规范,并注意层级之间的依赖关系 。
命名规范
一个好的命名应该要满足以下两个约束:
如果你觉得一个类或方法难以命名的时候,可能是其承载的功能太多了,需要进一步拆分 。
约定俗称的惯例 场景强约束示例