一個笑話說:把大象裝進冰箱需要幾個步驟?
一、拉開冰箱
二、把大象塞進去
三、關上冰箱
同理,把獅子裝進冰箱需要幾個步驟?
一、拉開冰箱
二、把獅子塞進去
三、關上冰箱
上面這個例子中大家是否發現其實這兩種方式有著共同的步驟,只是具體的實現稍有不同,簡言之就是這兩類行為可以共用一個步驟範本。由此可以引出這次要討論的設計模式—模板設計模式。
模板設計模式的原理可以用如下所示的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
<?php /** * 将狮子锁进冰箱里 * @author ben * */ require_once 'LockAnimal.php'; 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 />"; } }
現在問題來了,挖土機技術哪家強?開個玩笑吧。有些動物比較兇猛,不會乖乖的被推進冰箱,需要麻醉才行,我們需要為我們的程序加上一個鉤子,以處理這種情況。修改後的程式碼如下:
<?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(); }
<?php /** * 将狮子锁进冰箱里 * @author ben * */ require_once 'LockAnimal.php'; 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 'LockElephant.php'; require_once 'LockLion.php'; $elephant = new LockElephant(); $lion = new LockLion(); $elephant->lock(); $lion->lock();模板方法設計模式的官方定義是:在一個方法中定義一個演算法的骨架,而將一些步驟延遲到子類別。模板方法可以使得子類別可以在不改變演算法結構的情況下,重新定義演算法中的某些步驟。
以上就介紹了設計模式入門-模板方法模式(php版),包含了方面的內容,希望對PHP教程有興趣的朋友有所幫助。 🎜 🎜 🎜