1. 程式人生 > >我所理解的模板方法模式

我所理解的模板方法模式

一個 模板方法 通過 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

我所理解的模板方法模式