模板方法(Template)
模式是一种结构很简单的行为型模式,
百度定义:一个操作中算法的骨架,而将一些步骤延迟到子类中,模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
特定:灵活度高,可扩展性强。
通俗来说:在抽象父类中定义一个模板方法的方法,通过子类的覆盖使得相同算法框架可以有不同的执行结果
比如某餐厅有A,B两个套餐,里面包含的饮料和食物不同,则可以用代码表示如下:
*学习规范:如果子类是具体方法,那么父类作为抽象层只能是抽象类,不能用接口。
<?php
// 抽象模板类
abstract Class SetMealModel
{
/**
* A,B套餐
* @var string
*/
public $name;
/**
* 初始化构造A,B套餐
* @access public
* @param string $_name
*/
function __construct($_name)
{
$this->name =$_name;
}
/**
* 模板方法的方法
* @access public
*/
public function Make()
{
$this->MakeDrink();
$this->MakeFood();
echo $this->name."完成<br/>";
}
/**
* 抽象饮料制作方法
* @access public
*/
public abstract function MakeDrink();
/**
* 抽象饮料主食方法
* @access public
*/
public abstract function MakeFood();
}
// 具体A套餐
Class AsetMeal extends SetMealModel
{
/**
* 初始构造A套餐
* @access public
* @param string $name
*/
function __construct($name = "A套餐")
{
parent::__construct($name);
}
/**
* 具体饮料制作方法
* @access public
*/
function MakeDrink()
{
echo $this->name."饮料:雪碧<br/>";
}
/**
* 具体主食制作方法
* @access public
*/
function MakeFood()
{
echo $this->name."主食:照烧鸡排饭<br/>";
}
}
// B套餐
Class BsetMeal extends SetMealModel
{
/**
* 初始构造B套餐
* @access public
* @param string $name
*/
function __construct($name = "B套餐")
{
parent::__construct($name);
}
/**
* 具体饮料制作方法
* @access public
*/
function MakeDrink()
{
echo $this->name."饮料:可乐<br/>";
}
/**
* 具体主食制作方法
* @access public
*/
function MakeFood()
{
echo $this->name."主食:咖喱猪排饭<br/>";
}
}
<?php
header("Content-Type:text/html;charset=utf-8");
require_once "Template.php";
// A套餐
$one = new AsetMeal();
$one->Make();
// B套餐
$two = new BsetMeal();
$two->Make();
结果如下:
A套餐饮料:雪碧
A套餐主食:照烧鸡排饭
A套餐完成
B套餐饮料:可乐
B套餐主食:咖喱猪排饭
B套餐完成