設計模式入門-模板方法模式(php版)

WBOY
發布: 2016-08-08 09:27:09
原創
911 人瀏覽過

一個笑話說:把大象裝進冰箱需要幾個步驟?

一、拉開冰箱

二、把大象塞進去

三、關上冰箱

同理,把獅子裝進冰箱需要幾個步驟?

一、拉開冰箱

二、把獅子塞進去

三、關上冰箱

上面這個例子中大家是否發現其實這兩種方式有著共同的步驟,只是具體的實現稍有不同,簡言之就是這兩類行為可以共用一個步驟範本。由此可以引出這次要討論的設計模式—模板設計模式。

模板設計模式的原理可以用如下所示的uml類別圖來表示:

 

具體的程式碼範例:

LockAnimal.php

<?php
/**
 * 将动物锁进冰箱里抽象类
 * @author ben
 *
 */
abstract class LockAnimal{
    /**
     * 模板方法,使用final关键词防止子类覆盖
     */
   public final function lock(){
       $this->open();
       $this->push();
       $this->close();
   } 
   
   /**
    * 打开冰箱
    */
   abstract function open();
   
   /**
    * 将动物推进冰箱
    */
   abstract function push();
   
   /**
    * 关上冰箱
    */
   abstract function close();
}
登入後複製
LockEleph
LockAnimal.php

<?php
/**
 * 将狮子锁进冰箱里
 * @author ben
 *
 */
require_once &#39;LockAnimal.php&#39;;
class LockElephant extends LockAnimal{
   
   /**
    * (non-PHPdoc)
    * @see LockAnimal::open()
    */
   public function open(){
       echo "in order to lock an elephant into a fridge, you need to open the fridge first<br />";
   }
   
   /**
    * (non-PHPdoc)
    * @see LockAnimal::push()
    */
   public function push(){
       echo "i'm pushing the elephant<br />";
   }
   
   /**
    * (non-PHPdoc)
    * @see LockAnimal::close()
    */
   public function close(){
       echo "finally, now i can close the fridge<br />";
   }
}
登入後複製
登入後複製
LockLion.php
<?php
/**
 * 将狮子锁进冰箱里
 * @author ben
 *
 */
require_once 'LockAnimal.php';
class LockLion extends LockAnimal{
   
   /**
    * (non-PHPdoc)
    * @see LockAnimal::open()
    */
   public function open(){
       echo "in order to lock an lion into a fridge, you need to open the fridge first<br />";
   }
   
   /**
    * (non-PHPdoc)
    * @see LockAnimal::push()
    */
   public function push(){
       echo "i'm pushing the lion<br />";
   }
   
   /**
    * (non-PHPdoc)
    * @see LockAnimal::close()
    */
   public function close(){
       echo "finally, now i can close the fridge<br />";
   }
}
登入後複製


現在問題來了,挖土機技術哪家強?開個玩笑吧。有些動物比較兇猛,不會乖乖的被推進冰箱,需要麻醉才行,我們需要為我們的程序加上一個鉤子,以處理這種情況。修改後的程式碼如下:


LockAnimal.php

<?php
/**
 * 将动物锁进冰箱里抽象类
 * @author ben
 *
 */
abstract class LockAnimal{
    /**
     * 模板方法,使用final关键词防止子类覆盖
     */
   public final function lock(){
       $this->open();
       if($this->needAnesthetic()){
           $this->anesthetic();
       }
       $this->push();
       $this->close();
   } 
   
   /**
    * 打开冰箱
    */
   abstract function open();
   
   /**
    * 是否需要麻醉
    */
   protected function needAnesthetic(){
       return false;
   }
   
   protected function anesthetic(){
       echo "anestheticing the animal";
   }
   
   /**
    * 将动物推进冰箱
    */
   abstract function push();
   
   /**
    * 关上冰箱
    */
   abstract function close();
}
登入後複製

LockElephant.php

<?php
/**
 * 将狮子锁进冰箱里
 * @author ben
 *
 */
require_once &#39;LockAnimal.php&#39;;
class LockElephant extends LockAnimal{
   
   /**
    * (non-PHPdoc)
    * @see LockAnimal::open()
    */
   public function open(){
       echo "in order to lock an elephant into a fridge, you need to open the fridge first<br />";
   }
   
   /**
    * (non-PHPdoc)
    * @see LockAnimal::push()
    */
   public function push(){
       echo "i'm pushing the elephant<br />";
   }
   
   /**
    * (non-PHPdoc)
    * @see LockAnimal::close()
    */
   public function close(){
       echo "finally, now i can close the fridge<br />";
   }
}
登入後複製
登入後複製
LockLion.php
<?php
/**
 * 将狮子锁进冰箱里
 * @author ben
 *
 */
require_once 'LockAnimal.php';
class LockLion extends LockAnimal{
   
   /**
    * (non-PHPdoc)
    * @see LockAnimal::open()
    */
   public function open(){
       echo "in order to lock an lion into a fridge, you need to open the fridge first<br />";
   }
   
   protected function needAnesthetic(){
       return true;
   }
   
   protected function anesthetic(){
       echo "anestheticing the lion<br />";
   }
   
   /**
    * (non-PHPdoc)
    * @see LockAnimal::push()
    */
   public function push(){
       echo "i'm pushing the lion<br />";
   }
   
   /**
    * (non-PHPdoc)
    * @see LockAnimal::close()
    */
   public function close(){
       echo "finally, now i can close the fridge<br />";
   }
}
登入後複製
index.php
<?php
require_once &#39;LockElephant.php&#39;;
require_once &#39;LockLion.php&#39;;

$elephant = new LockElephant();
$lion = new LockLion();

$elephant->lock();
$lion->lock();
登入後複製
模板方法設計模式的官方定義是:在一個方法中定義一個演算法的骨架,而將一些步驟延遲到子類別。模板方法可以使得子類別可以在不改變演算法結構的情況下,重新定義演算法中的某些步驟。

以上就介紹了設計模式入門-模板方法模式(php版),包含了方面的內容,希望對PHP教程有興趣的朋友有所幫助。 🎜 🎜 🎜
相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板