php 模板方法模式
代码总是复制粘贴?用 PHP 模板方法模式给业务搭个“标准骨架”
写后端接口时,开发者大概都经历过这种焦虑:处理不同支付渠道的回调、做多端的数据同步、或者适配不同格式的报表导出。逻辑主干完全一致,仅有个别校验或渲染细节不同。图快直接复制黏贴,代码仓库很快就会被高度相似的类塞满。一旦后续要统一加埋点、换超时设置或重构中间件,改动就像在走钢丝,稍微手抖就全线报错。
这类“流程固定、局部可变”的业务,正是模板方法模式的天然温床。它不需要引入额外框架,纯粹靠 PHP 的原生面向对象特性,就能把散落的代码收编成可复用的标准流水线。
该模式的核心动作就两步:定骨架,留钩子。把不变的执行顺序抽成公共方法并锁定,将可变的步骤定义为抽象方法交给子类填充。在实际 PHP 工程中,建议按以下结构落地:
abstract class BasePipeline {
// 锁定总流程,禁止子类篡改执行顺序
final public function run() {
$input = $this->prepareInput();
$result = $this->process($input);
$this->persist($result);
}
// 必须重写的具体步骤
abstract protected function prepareInput(): mixed;
abstract protected function process(mixed $input): mixed;
// 可选重写的兜底步骤
protected function persist(mixed $data): void {
Log::info('Pipeline finished', ['data' => $data]);
}
}
加上 final 修饰模板方法是工业级实践的关键。它能从语法层面封死子类打乱执行流的路径,避免有人不小心把 persist() 提到 process() 前面导致脏数据入库。抽象方法明确责任边界,而带默认实现的 protected 方法则承担容错职责,子类按需覆盖即可。
很多人拿到这个模式后容易走向极端,为了继承强行拆解类结构。这里需要补一个实用视角:模板方法适合处理算法级差异,不适合处理纯数据差异。如果两个类只差一个过滤条件或参数名称,直接传数组配置或策略对象更轻量;只有当步骤缺失、返回值类型不同、或执行环境隔离时才值得拉起继承链。
落地时配合现代 PHP 特性会大幅降低维护成本。开启严格类型声明,给抽象方法标注返回值类型,IDE 能在编写期直接标黄未实现的节点。遇到需要在模板中途终止的场景,不要在基类里塞大量 if-else,改为抛出结构化异常,由外部调用方统一 try-catch 处理,保持管线洁净。若业务线不断扩张,可将该模式与简单工厂结合,通过注册表动态实例化对应的 Pipeline 子类,彻底消除冗长的 switch-case。
设计模式本质上是给混乱的代码立规矩。当你下次面对一堆长得极似的业务控制器时,不妨先画出数据流向图,圈出哪部分已经板上钉钉,哪部分还能灵活替换。把确定性锁死,把不确定性开放,后续迭代的边际成本就会直线下降。好代码从不靠堆砌技巧,而是源于对流程的诚实梳理。


还没有评论,来说两句吧...