PHP設計模式—模板方法模式

 

定義:

模板方法模式(Template Method):定義一個操做中的算法的骨架,而將一些步驟延遲到子類中。模板方法使得子類能夠不改變一個算法的結構便可重定義該算法的某些特定步驟。算法

 

結構:

  • AbstractClass:抽象類,定義並實現了一個模板方法。這個模板方法通常是一個具體方法,它給出了一個頂級邏輯的骨架,而邏輯的組成步驟在相應的抽象操做中,推遲到子類實現。
  • ConcreteClass:子類,實現父類所定義的一個或多個抽象方法。每個 AbstractClass 均可以有任意多個ConcreteClass 與之對應,而每個 ConcreteClass均可以給出這些抽象方法(也就是頂級邏輯的組成步驟)的不一樣實現,從而使得頂級邏輯的實現各不相同。
  • Client:客戶端代碼。

 

代碼實例:

/**
 * 抽象類
 * Class AbstractClass
 */
abstract class AbstractClass
{

    /**
     * 模板方法,定義操做順序,給出邏輯骨架,而邏輯的組成是一些相對應的抽象操做,它們都推遲到子類實現
     */
    public function templateMethod()
    {
        $this->begin();
        $this->primitiveOperation1();
        $this->primitiveOperation2();
        $this->end();
    }

    /**
     * 抽象行爲,由子類實現
     */
    abstract public function primitiveOperation1();

    /**
     * 抽象行爲,由子類實現
     */
    abstract public function primitiveOperation2();


    /**
     * 一些公用邏輯方法
     */
    public function begin()
    {
        echo '開始' . '<br>';
    }

    /**
     * 一些公用邏輯方法
     */
    public function end()
    {
        echo '結束' . '<br>';
    }
}


/**
 * 子類
 * Class ConcreteClassA
 */
class ConcreteClassA extends AbstractClass
{

    public function primitiveOperation1()
    {
        // TODO: Implement primitiveOperation1() method.
        echo 'ConcreteClassA類primitiveOperation1方法的具體實現' . '<br>';
    }

    public function primitiveOperation2()
    {
        // TODO: Implement primitiveOperation2() method.
        echo 'ConcreteClassA類primitiveOperation2方法的具體實現' . '<br>';
    }
}


/**
 * 子類
 * Class ConcreteClassB
 */
class ConcreteClassB extends AbstractClass
{

    public function primitiveOperation1()
    {
        // TODO: Implement primitiveOperation1() method.
        echo 'ConcreteClassB類primitiveOperation1方法的具體實現' . '<br>';
    }

    public function primitiveOperation2()
    {
        // TODO: Implement primitiveOperation2() method.
        echo 'ConcreteClassB類primitiveOperation2方法的具體實現' . '<br>';
    }
}


// 客戶端調用
// ConcreteClassA
$concreteClassA = new ConcreteClassA();
$concreteClassA->templateMethod();

// ConcreteClassB
$concreteClassB = new ConcreteClassB();
$concreteClassB->templateMethod();


// 結果
開始
ConcreteClassA類primitiveOperation1方法的具體實現
ConcreteClassA類primitiveOperation2方法的具體實現
結束
開始
ConcreteClassB類primitiveOperation1方法的具體實現
ConcreteClassB類primitiveOperation2方法的具體實現
結束

 

總結:

  • 當咱們要完成在某一個細節層次一致的一個過程或一系列步驟,但其個別步驟在更詳細的層次上的實現可能不一樣時,咱們一般考慮用模板方法模式來處理。
  • 模板方法模式是經過把不變行爲搬移到超類,去除子類中的重複代碼來體現它的優點,咱們經過模板方法把這些行爲搬移到單一的地方,這樣就幫助子類擺脫重複的不變行爲的糾纏。
  • 模板方法模式提供了一個很好的代碼複用平臺。
相關文章
相關標籤/搜索