模板方法模式属于行为型设计模式,核心思想是在抽象类中定义算法的整体执行流程(即模板方法),将流程中可变的具体步骤声明为抽象方法,由不同的子类根据自身需求实现这些抽象方法,最终在不改变算法结构的前提下完成不同的业务逻辑。

模板方法模式的核心角色
在PHP中实现模板方法模式主要包含三个核心角色:
- 抽象模板类:定义算法的整体骨架(模板方法),声明需要子类实现的可变步骤为抽象方法,同时可以提供一些公共的通用方法供子类复用。
- 具体实现类:继承抽象模板类,实现父类中声明的所有抽象方法,完成自身特有的业务逻辑。
- 客户端:实例化具体实现类,调用模板方法触发整个算法流程的执行。
PHP实现模板方法模式的步骤
1. 定义抽象模板类
首先创建抽象类,在其中定义模板方法和抽象步骤方法,模板方法通常是公共的、不可被重写的,用final关键字修饰避免子类修改核心流程。
<?php
/**
* 抽象模板类:定义数据处理的算法骨架
*/
abstract class DataProcessTemplate
{
// 模板方法:定义整体流程,禁止子类重写
final public function process()
{
$this->loadData();
$data = $this->parseData();
$result = $this->handleData($data);
$this->saveResult($result);
$this->logProcess();
}
// 通用方法:加载数据,公共逻辑
protected function loadData()
{
echo "加载原始数据<br/>";
}
// 抽象方法:解析数据,由子类实现
abstract protected function parseData();
// 抽象方法:处理数据,由子类实现
abstract protected function handleData($data);
// 通用方法:保存结果,公共逻辑
protected function saveResult($result)
{
echo "保存处理结果:{$result}<br/>";
}
// 钩子方法:记录流程日志,子类可选择是否重写
protected function logProcess()
{
echo "数据处理流程执行完成<br/>";
}
}
2. 实现具体子类
创建两个具体子类,分别实现不同的数据解析和处理逻辑,复用父类的公共方法。
<?php
/**
* 具体实现类1:处理文本数据
*/
class TextDataProcessor extends DataProcessTemplate
{
protected function parseData()
{
echo "解析文本数据<br/>";
return "文本解析结果";
}
protected function handleData($data)
{
echo "处理文本数据:{$data}<br/>";
return "文本处理完成";
}
}
/**
* 具体实现类2:处理JSON数据
*/
class JsonDataProcessor extends DataProcessTemplate
{
protected function parseData()
{
echo "解析JSON数据<br/>";
return ["status" => 1, "msg" => "json解析结果"];
}
protected function handleData($data)
{
echo "处理JSON数据:".json_encode($data)."<br/>";
return "JSON处理完成";
}
// 重写钩子方法,增加自定义日志
protected function logProcess()
{
echo "JSON数据处理流程执行完成,额外记录日志<br/>";
}
}
3. 客户端调用示例
客户端只需要实例化不同的具体子类,调用统一的模板方法即可触发对应的算法流程。
<?php // 处理文本数据 $textProcessor = new TextDataProcessor(); $textProcessor->process(); echo "<hr/>"; // 处理JSON数据 $jsonProcessor = new JsonDataProcessor(); $jsonProcessor->process();
模板方法模式的优势与注意事项
使用模板方法模式实现模版化算法流程的优势十分明显:首先核心算法骨架集中在抽象类中,避免了多个子类重复编写相同的流程代码,提升了代码复用性;其次新增业务场景时只需要新增具体子类实现抽象方法即可,符合开闭原则,降低了代码的维护成本;另外通过钩子方法可以给子类提供可选的扩展点,灵活性更高。
需要注意的点是,模板方法如果定义得过于复杂,会导致抽象类的职责过重,此时可以考虑拆分抽象类;另外子类只能修改可变步骤的实现,不能修改整体流程,若需要修改流程则需要调整抽象类的模板方法,可能影响所有子类。
适用场景总结
当遇到以下场景时,适合在PHP中使用模板方法模式实现模版化算法流程:多个类存在相同的算法结构,仅部分步骤实现不同;需要控制子类的扩展点,只允许子类修改特定步骤;需要复用公共的业务逻辑,避免代码重复。通过合理应用该模式,可以让PHP项目的代码结构更清晰,可维护性和扩展性更强。
PHP模板方法模式Template_Method算法骨架修改时间:2026-07-12 19:51:27