定义
在父类中定义处理流程的框架,在子类中实现具体处理的模式就称为模板方法模式
参与角色
抽象类(AbstractClass)
抽象类不仅负责实现模板方法,还负责声明在模板方法中所使用到的抽象方法。
具体类(子类)
该角色负责具体实现抽象类角色中定义的抽象方法。这里实现的方法将会在抽象类角色的模板方法中被调用。
优点
- 封装不变部分,扩展可变部分
- 提取公共部分代码,便于维护
- 行为由父类控制,子类负责实现
使用场景
- 多个子类有共有方法,并且逻辑基本相同
- 重要、复杂的算法,可以把核心算法设计为模板方法,周边的相关细节功能则由各个子类实现
- 重构时,模板方法是一个经常使用的方法,把相同的代码抽取到父类中,然后通过构造函数约束其行为
代码示例
# 抽象类 AbstractClass.php
<?php
namespace App\Test;
abstract class AbstractClass
{
/**
* 模板方法,定义执行的流程
*/
final public function main()
{
$this->operate1();
$this->operate2();
}
/**
* 操作1
* @return mixed
*/
abstract protected function operate1();
/**
* 操作2
* @return mixed
*/
abstract protected function operate2();
}
# 具体类1 ConcreteClassOne.php
<?php
namespace App\Test;
class ConcreteClassOne extends AbstractClass
{
/**
* 操作1
* @return mixed|void
*/
protected function operate1()
{
echo 'ConcreteClassOne: this is operate1';
}
/**
* 操作2
* @return mixed|void
*/
protected function operate2()
{
echo "ConcreteClassOne: this is operate2";
}
}
# 具体类2 ConcreteClassTwo
<?php
namespace App\Test;
class ConcreteClassTwo extends AbstractClass
{
/**
* 操作1
* @return mixed|void
*/
protected function operate1()
{
echo 'ConcreteClassTwo: this is operate1';
}
/**
* 操作2
* @return mixed|void
*/
protected function operate2()
{
echo 'ConcreteClassTwo: this is operate2';
}
}