PHP设计模式:模版方法模式
2019-06-20 本文已影响0人
Zed_790e
前言
在模板模式(Template Pattern)中,一个抽象类公开定义了执行它的方法的方式/模板。它的子类可以按需要重写方法实现,但调用将以抽象类中定义的方式进行。
定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
代码
<?php
//定义一份问卷抽象类,里面实现了三个问题,并在其中抽象出三个答案
abstract class Questionnaire
{
public function problemA()
{
echo "PHP是不是世界上最好的语言" . PHP_EOL;
echo "答案:" . $this->answerA() . PHP_EOL;
}
public function problemB()
{
echo "Swoole是由谁开发的" . PHP_EOL;
echo "答案:" . $this->answerB() . PHP_EOL;
}
public function problemC()
{
echo "如果女朋友和老妈一起掉进水里了你会先救谁?" . PHP_EOL;
echo "答案:" . $this->answerC() . PHP_EOL;
}
abstract public function answerA();
abstract public function answerB();
abstract public function answerC();
}
//问卷A继承问卷,并且只要实现三个抽象答案
Class QuestionnaireA extends Questionnaire
{
public function answerA()
{
return '是';
}
public function answerB()
{
return '韩天峰';
}
public function answerC()
{
return '我妈会游泳';
}
}
//问卷B继承问卷,并且只要实现三个抽象答案
Class QuestionnaireB extends Questionnaire
{
public function answerA()
{
return '那肯定是QAQ';
}
public function answerB()
{
return '韩天峰';
}
public function answerC()
{
return '先把自己掐死';
}
}
echo 'A答卷的回答' . PHP_EOL;
$A = new QuestionnaireA();
$A->problemA();
$A->problemB();
$A->problemC();
echo '-----------------' . PHP_EOL;
echo 'B答卷的回答';
$B = new QuestionnaireB();
$B->problemA();
$B->problemB();
$B->problemC();
输出

也可以不使用抽象类直接使用继承,但是因为抽象类是有强制继承他的子类们必须实现其抽象方法的,个人觉得在严格意义上来说能有更好的规范。