模板方法设计模式
模板方法设计模式用于创建一组必须执行类似行为的子类。
这种设计模式包括一个模板方法,它是一个抽象类。具体子类可以覆盖抽象类中的方法。模板方法由算法的骨架组成;子类可以使用覆盖来改变算法的具体行为。
因此,这是一种非常简单的设计模式;它在鼓励松散耦合的同时,也控制了允许子类化的程度。因此,它比简单的多态行为更加精细。
请看下面的 Pasta
类抽象:
Unresolved include directive in modules/ROOT/pages/ch05/ch5-05.adoc - include::example$/Chapter 5/Template/Pasta.php[]
我们有一个简单的构造函数来确定意大利面(pasta)是否含有奶酪,还有一个 cook
函数来运行烹饪算法。
请注意,添加各种配料的函数是抽象出来的;在子类中,我们用所需的行为来实现这些方法。
假设我们想制作肉丸意大利面(meatball pasta)。我们可以如下实现这个抽象类:
Unresolved include directive in modules/ROOT/pages/ch05/ch5-05.adoc - include::example$/Chapter 5/Template/MeatballPasta.php[]
我们可以在 index.php
文件中使用以下脚本来采样此代码:
Unresolved include directive in modules/ROOT/pages/ch05/ch5-05.adoc - include::example$Chapter 5/Template/index.php[]
由于各个函数中的所有 var_dump
变量显示了各种状态消息,我们可以看到如下输出:

现在,假设我们想做一份纯素食谱。我们可以在不同的上下文中使用相同的抽象。
这次当涉及到添加肉类或奶酪时,这些函数什么也不干;它们可以返回 false
或 null
值:
Unresolved include directive in modules/ROOT/pages/ch05/ch5-05.adoc - include::example$Chapter 5/Template/VeganPasta.php[]
让我们修改我们的 index.php 文件来表示这种行为:
Unresolved include directive in modules/ROOT/pages/ch05/ch5-05.adoc - include::example$Chapter 5/Template/index.php[]
输出如下:

这种设计模式简单易用,但从根本上说,它可以让你抽象出算法设计,并将责任委托给你想要的子类。