定义一个操作中的算法骨架,而将一些步骤延迟到子类中,使得子类可以不改变一个算法结构即可重定义该算法的某些特定步骤<br />模板方法模式,是日常容易用到的模式之一,是对继承最好的诠释,当子类中有重复的动作的时候,将他们提取出来,放在父类中进行统一的出路, <br />比如下楼,吃饭,回家,睡觉,中间吃饭不固定,不知道吃什么,其他都是固定的,将除了吃饭,其他的放在父类中,吃饭再继承的子类中实现,调用父类的方法返回整个流程,<br />定义一个父类或者抽象类,返回最终的结果,按照流程,将一些不确定的方法,推迟到子类实现,最终调用返回<br />![image.png](https://cdn.nlark.com/yuque/0/2021/png/22438777/1635408179274-a14037ac-3b0f-442d-a0ee-c90a3d16bded.png#clientId=u35f766e3-16b7-4&from=paste&height=423&id=ud4f08fd5&margin=%5Bobject%20Object%5D&name=image.png&originHeight=423&originWidth=887&originalType=binary&ratio=1&size=47008&status=done&style=none&taskId=u930798cb-47f2-49fc-a4c6-8217e48ae6d&width=887)
<?php
//定义一个抽象类
abstract class Cache
{
private $config;
private $conn;
public function __construct()
{
$this->init();
}
public function init()
{
$this->GetConfig();
$this->OpenConnection();
$this->CheckConnection();
}
abstract public function GetConfig();
abstract public function OpenConnection();
abstract public function CheckConnection();
}
//子类实现
class MemcachedCache extends Cache
{
public function GetConfig()
{
echo '获取Memcached配置文件!', PHP_EOL;
$this->config = 'memcached';
}
public function OpenConnection()
{
echo '链接memcached!', PHP_EOL;
$this->conn = 1;
}
public function CheckConnection()
{
if ($this->conn) {
echo 'Memcached连接成功!', PHP_EOL;
} else {
echo 'Memcached连接失败,请检查配置项!', PHP_EOL;
}
}
}
//子类实现
class RedisCache extends Cache
{
public function GetConfig()
{
echo '获取Redis配置文件!', PHP_EOL;
$this->config = 'redis';
}
public function OpenConnection()
{
echo '链接redis!', PHP_EOL;
$this->conn = 0;
}
public function CheckConnection()
{
if ($this->conn) {
echo 'Redis连接成功!', PHP_EOL;
} else {
echo 'Redis连接失败,请检查配置项!', PHP_EOL;
}
}
}
$m = new MemcachedCache();
$r = new RedisCache();
一个缓存类就是这样,跟框架的类似<br />子类只需要定义自己的方法实现就可了,重复的代码交给父类,如果没有父类需要自己实现init()