我所理解的模板方法模式
阿新 • • 發佈:2018-11-17
一個 模板方法 通過 echo lasso bstr fun opera concrete
定義
在父類中定義處理流程的框架,在子類中實現具體處理的模式就稱為模板方法模式
參與角色
抽象類(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';
}
}
原文地址:https://segmentfault.com/a/1190000016164272
我所理解的模板方法模式