设计模式心得:五——模板方法模式
时间:2010-10-18 来源:陌路vs追忆
模板方法定义看起来很拗口,但是其实在编程用到的却是非常的多的,它主要是用于创建框架(系统框架,或者某一算法的框架)然后由子类来决定具体的步骤。比如说,我们在淘宝上买东西,一般的步骤都是,搜索商品,确认要购买后,点击购买商品,然后付款(这里的付款就可以由用户自己决定到底用哪种付款方式),接着确认收货,评价。它就定义了一个算法框架,然后由用户去决定具体的步骤。
代码
<?php
abstract class Taobao {
private $_goods;
protected $_name;
//选择一个商品
public function __construct($goods, $name)
{
$this->_goods = $goods;
$this->_name = $name;
}
// 购物流程
public final function shopping()
{
// 确认购买
$this->buy();
// 付款
$this->pay();
// 确认收货
$this->receive();
// 评价
$this->comment();
}
public function buy()
{
echo $this->_name . '购买了商品:' . $this->_goods . '。<br />';
}
// 付款由子类来决定采用哪种付款方式
abstract public function pay();
public function receive()
{
echo $this->_name . '确认收货:' . $this->_goods . '。<br />';
}
public function comment()
{
}
}
// A购物流程
class AProcess extends Taobao {
public function pay()
{
echo $this->_name . '采用了网银方式付款。<br />';
}
public function comment()
{
echo $this->_name . '对卖家进行了好评。<br />';
}
}
// B购物流程
class BProcess extends Taobao {
public function pay()
{
echo $this->_name . '采用了支付宝的方式付款。<br />';
}
public function comment()
{
echo $this->_name . '对买家进行了中评。<br />';
}
}
// C购物流程
class CProcess extends Taobao {
public function pay()
{
echo $this->_name . '采用了网银的方式付款。<br />';
}
// 我未进行评价
public function comment()
{
}
}
// A采用了A购物流程
$a = new AProcess('Nokia 6300', '张三');
$a->shopping();
echo '<hr />';
// B采用了B购物流程
$b = new BProcess('流氓兔', '李四');
$b->shopping();
echo '<hr />';
// C采用了C购物流程
$c = new CProcess('T-shirt', '王五');
$c->shopping();
?>
// 结果
// 张三购买了商品:Nokia 6300。
// 张三采用了网银方式付款。
// 张三确认收货:Nokia 6300。
// 张三对卖家进行了好评。
// --------------------------------------------------------------------------------
// 李四购买了商品:流氓兔。
// 李四采用了支付宝的方式付款。
// 李四确认收货:流氓兔。
// 李四对买家进行了中评。
// --------------------------------------------------------------------------------
// 王五购买了商品:T-shirt。
// 王五采用了网银的方式付款。
// 王五确认收货:T-shirt。
一般当你需要定义一个算法结构,并且这个算法结构可能有多种变体的时候都可以考虑采用模板方法模式,它能够很方便的实现同一算法下的不同事情。
模板方法还有个很大的用途就是钩子,比如上例中的评价,在父类中,它未被定义,在子类中就可以执行一些过程,也可以不执行任何过程,它可以方便的在系统的结构中挂钩。
当然使用模板方法也有不好,就是由于算法结构固定,依赖性就比较高,而且在子类中实现方法灵活性也比较差,一个子类只能实现一种流程,这个时候就可以考虑其他设计模式,或者与其他设计模式相结合以实现运行时决定具体实现的高灵活性程序。
相关阅读 更多 +