一个笑话说:把大象装进冰箱需要几个步骤?
一、拉开冰箱
二、把大象塞进去
三、关上冰箱
同理,把狮子装进冰箱需要几个步骤?
立即学习“PHP免费学习笔记(深入)”;
一、拉开冰箱
二、把狮子塞进去
三、关上冰箱
上面这个例子中大家是否发现其实这两种方式有着共同的步骤,只是具体的实现稍有不同,简言之就是这两类行为可以共享一个步骤模板。由此可以引出这次要讨论的设计模式—模板设计模式。
模板设计模式的原理可以用如下所示的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();
}<?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 />";
}
}<?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();
}<?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 />";
}
}<?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 />";
}
}<?php require_once 'LockElephant.php'; require_once 'LockLion.php'; $elephant = new LockElephant(); $lion = new LockLion(); $elephant->lock(); $lion->lock();
以上就介绍了设计模式入门-模板方法模式(php版),包括了方面的内容,希望对PHP教程有兴趣的朋友有所帮助。
PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号