您的位置:首页 > 编程语言 > PHP开发

PHP的模板Template模式

2015-12-10 16:03 603 查看
继承关系由于自身的缺陷,被专家们扣上了“罪恶”的帽子。“使用委派关系代替继承关系”,“尽量使用接口实现而不是抽象类继承”等等专家警告,让我们这些菜鸟对继承“另眼相看”。其实,继承还是有很多自身的优点所在。只是被大家滥用的似乎缺点更加明显了。合理的利用继承关系,还是能对你的系统设计起到很好的作用的。而模板方法模式就是其中的一个使用范例。

GOF给模板方法(TemplateMethod)模式定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。这里的算法的结构,可以理解为你根据需求设计出来的业务流程。特定的步骤就是指那些可能在内容上存在变数的环节。

可以看出来,模板方法模式也是为了巧妙解决变化对系统带来的影响而设计的。使用模板方法使系统扩展性增强,最小化了变化对系统的影响。这一点,在下面的举例中可以很明显的看出来。

01
<?php
02
/**
03
*
模板模式
04
*
05
*
定义一个操作中的算法骨架,而将一些步骤延迟到子类中,使得子类可以不改变一个算法的结构可以定义该算法的某些特定步骤
06
*
07
*/
08
abstract
class
TemplateBase
09
{
10
public
function
Method1()
11
{
12
echo
"abstract
Method<br/>"
;
13
}
14
15
public
function
Method2()
16
{
17
echo
"abstract
Method2<br/>"
;
18
}
19
20
public
function
Method3()
21
{
22
echo
"abstract
Method3<br/>"
;
23
}
24
25
public
function
doSomeThing()
26
{
27
$this
->Method1();
28
$this
->Method2();
29
$this
->Method3();
30
}
31
}
32
33
class
TemplateObject
extends
TemplateBase
34
{
35
}
36
37
class
TemplateObject1
extends
TemplateBase
38
{
39
public
function
Method3()
40
{
41
echo
"TemplateObject1
Method3<br/>"
;
42
}
43
}
44
45
class
TemplateObject2
extends
TemplateBase
46
{
47
public
function
Method2()
48
{
49
echo
"TemplateObject2
Method2<br/>"
;
50
}
51
}
52
53
//
实例化
54
$objTemplate
=
new
TemplateObject();
55
$objTemplate1
=
new
TemplateObject1();
56
$objTemplate2
=
new
TemplateObject2();
57
58
$objTemplate
->doSomeThing();
59
echo
'<br
/>'
;
60
$objTemplate1
->doSomeThing();
61
echo
'<br
/>'
;
62
$objTemplate2
->doSomeThing();
63
?>
程序运行结果:

01
abstract
Method1
02
abstract
Method2
03
abstract
Method3
04
05
abstract
Method1
06
abstract
Method2
07
TemplateObject1
Method3
08
09
abstract
Method1
10
TemplateObject2
Method2
11
abstract
Method3
AbstractClass(抽象类):定义了一到多个的抽象方法,以供具体的子类来实现它们;而且还要实现一个模板方法,来定义一个算法的骨架。该模板方法不仅调用前面的抽象方法,也可以调用其他的操作,只要能完成自身的使命。

ConcreteClass(具体类):实现父类中的抽象方法以完成算法中与特定子类相关的步骤。

根据上面对定义的分析,以及例子的说明,可以看出模板方法适用于以下情况:

一次性实现一个算法的不变的部分,并将可变的行为留给子类来实现。

各子类中公共的行为应被提取出来并集中到一个公共父类中以避免代码重复。其实这可以说是一种好的编码习惯了。

控制子类扩展。模板方法只在特定点调用操作,这样就只允许在这些点进行扩展。比如上面runBare()方法就只在runTest前面适用setUp方法。如果你不愿子类来修改你的模板方法定义的框架,你可以采用两种方式来做:一是在API中不体现出你的模板方法;二、将你的模板方法置为final就可以了。

可以看出,使用模板方法模式可以将代码的公共行为提取出来,达到复用的目的。而且,在模板方法模式中,是由父类的模板方法来控制子类中的具体实现。这样你在实现子类的时候,根本不需要对业务流程有太多的了解。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: