一个笑话说:把大象装进冰箱需要几个步骤?
一、拉开冰箱
二、把大象塞进去
三、关上冰箱
同理,把狮子装进冰箱需要几个步骤?
立即学习“PHP免费学习笔记(深入)”;
一、拉开冰箱
二、把狮子塞进去
三、关上冰箱
上面这个例子中大家是否发现其实这两种方式有着共同的步骤,只是具体的实现稍有不同,简言之就是这两类行为可以共享一个步骤模板。由此可以引出这次要讨论的设计模式—模板设计模式。
模板设计模式的原理可以用如下所示的uml类图来表示:
jQuery图片列表动画显示效果,鼠标移到图片上会弹出文字描述,非常适合做素材、网站模板主题的图片列表,兼容主流浏览器,php中文网推荐下载! 使用方法: 1、在head区域引入样式表文件lrtk.css 2、在head区域引入jquery.1.4.2.min.js和lrtk.js 3、在你的网页中加入注释区域

具体的代码示例:
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 '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 />";
}
}现在问题来了,挖掘机技术哪家强?开个玩笑啦。有些动物比较凶猛,不会乖乖的被推进冰箱,需要麻醉才行,我们需要为我们的程序加上一个钩子,以处理这种情况。修改后的代码如下:
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 '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教程有兴趣的朋友有所帮助。










