我所理解的模板方法模式

定義

在父類中定義處理流程的框架,在子類中實現具體處理的模式就稱爲模板方法模式

參與角色

抽象類(AbstractClass)php

抽象類不只負責實現模板方法,還負責聲明在模板方法中所使用到的抽象方法。算法

具體類(子類)框架

該角色負責具體實現抽象類角色中定義的抽象方法。這裏實現的方法將會在抽象類角色的模板方法中被調用。函數

優勢

  • 封裝不變部分,擴展可變部分
  • 提取公共部分代碼,便於維護
  • 行爲由父類控制,子類負責實現

使用場景

  • 多個子類有共有方法,而且邏輯基本相同
  • 重要、複雜的算法,能夠把核心算法設計爲模板方法,周邊的相關細節功能則由各個子類實現
  • 重構時,模板方法是一個常用的方法,把相同的代碼抽取到父類中,而後經過構造函數約束其行爲

代碼示例

# 抽象類  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';
    }


}
相關文章
相關標籤/搜索