1 模式介绍
定义一个操作中的算法的骨架,而将步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义算法的某些特定步骤。
2 模式中的角色
2.1 抽象类(AbstractClass):实现了模板方法,定义了算法的骨架。
2.2 具体类(ConcreteClass):实现抽象类中的抽象方法,已完成完整的算法。
3 模式结构
4 项目应用
4.1 需求分析
设计一个老师出题目,学生回答的场景。
4.2 类图设计
4.3 源码设计
<?php
/**
* 模板方法模式
* copyring (c) http://blog.csdn.net/CleverCode
*/
abstract class Exam
{/*{{{*/
public function question1()
{
echo "1+1=:\r\n";
echo "答案".$this->answer1()."\r\n";
}
public function question2()
{
echo "5*8=:\r\n";
echo "答案".$this->answer2()."\r\n";
}
public function question3()
{
echo "9 - 1=:\r\n";
echo "答案".$this->answer3()."\r\n";
}
abstract public function answer1();
abstract public function answer2();
abstract public function answer3();
}/*}}}*/
class StudentA extends Exam
{/*{{{*/
public function answer1()
{
return 2;
}
public function answer2()
{
return 40;
}
public function answer3()
{
return 8;
}
}/*}}}*/
class StudentB extends Exam
{/*{{{*/
public function answer1()
{
return 3;
}
public function answer2()
{
return 48;
}
public function answer3()
{
return 4;
}
}/*}}}*/
function start()
{
echo "A答题:\r\n";
$studentA = new StudentA();
$studentA->question1();
$studentA->question2();
$studentA->question3();
echo "\r\n";
echo "B答题:\r\n";
$studentB = new StudentA();
$studentB->question1();
$studentB->question2();
$studentB->question3();
}
start();
?>
4.4 执行结果
技术交流
CleverCode是一名架构师,技术交流,咨询问题,请加CleverCode创建的qq群(架构师俱乐部):517133582。加群和腾讯,阿里,百度,新浪等公司的架构师交流。【架构师俱乐部】宗旨:帮助你成长为架构师!