首页 >后端开发 >php教程 >设计模式入门-模板方法模式(php版)

设计模式入门-模板方法模式(php版)

WBOY
WBOY原创
2016-08-08 09:27:09943浏览

一个笑话说:把大象装进冰箱需要几个步骤?

一、拉开冰箱

二、把大象塞进去

三、关上冰箱

同理,把狮子装进冰箱需要几个步骤?

一、拉开冰箱

二、把狮子塞进去

三、关上冰箱

上面这个例子中大家是否发现其实这两种方式有着共同的步骤,只是具体的实现稍有不同,简言之就是这两类行为可以共享一个步骤模板。由此可以引出这次要讨论的设计模式—模板设计模式。

模板设计模式的原理可以用如下所示的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();
}
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 &#39;LockAnimal.php&#39;;
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 &#39;LockAnimal.php&#39;;
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教程有兴趣的朋友有所帮助。

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn