模板方法设计模式

模板方法设计模式用于创建一组必须执行类似行为的子类。

这种设计模式包括一个模板方法,它是一个抽象类。具体子类可以覆盖抽象类中的方法。模板方法由算法的骨架组成;子类可以使用覆盖来改变算法的具体行为。

因此,这是一种非常简单的设计模式;它在鼓励松散耦合的同时,也控制了允许子类化的程度。因此,它比简单的多态行为更加精细。

请看下面的 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 变量显示了各种状态消息,我们可以看到如下输出:

image 2023 10 31 09 49 51 434

现在,假设我们想做一份纯素食谱。我们可以在不同的上下文中使用相同的抽象。

这次当涉及到添加肉类或奶酪时,这些函数什么也不干;它们可以返回 falsenull 值:

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[]

输出如下:

image 2023 10 31 09 53 35 612

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