模板办法模式,也是咱们常常会在不经意间有会用到的模式之一。这个模式是对继承的最好诠释。当子类中有反复的动作时,将他们提取进去,放在父类中进行对立的解决,这就是模板办法模式的最简略艰深的解释。就像咱们平时做我的项目,每次的我的项目流程实都差不多,都有调研、开发、测试、部署上线等流程。而具体到每个我的项目中,这些流程的实现又不会完全相同。这个流程,就像是模板办法,让咱们每次都依照这个流程进行开发。
Gof 类图及解释
GoF 定义:定义一个操作中的算法的骨架,而将一些步骤提早到子类中。TemplateMethod 使得子类能够不扭转一个算法的构造即可重定义该算法的某些特定步骤。
GoF 类图
代码实现
abstract class AbstractClass
{public function TemplateMethod()
{$this->PrimitiveOperation1();
$this->PrimitiveOperation2();}
abstract public function PrimitiveOperation1();
abstract public function PrimitiveOperation2();}
定义一个抽象类,有一个模板办法 TemplateMethod(),这个办法中咱们对算法操作方法进行调用。而这些算法形象办法是在子类中去实现的。
class ConcreteClassA extends AbstractClass
{public function PrimitiveOperation1()
{echo '具体类 A 实现办法 1', PHP_EOL;}
public function PrimitiveOperation2()
{echo '具体类 A 实现办法 2', PHP_EOL;}
}
class ConcreteClassB extends AbstractClass
{public function PrimitiveOperation1()
{echo '具体类 B 实现办法 1', PHP_EOL;}
public function PrimitiveOperation2()
{echo '具体类 B 实现办法 2', PHP_EOL;}
}
具体的实现类,它们只须要去实现父类所定义的算法就能够了。
$c = new ConcreteClassA();
$c->TemplateMethod();
$c = new ConcreteClassB();
$c->TemplateMethod();
在客户端的调用中,实例化子类,但调用的是子类所继承的父类的模板办法。就能够实现对立的算法调用了。
- 模板办法模式置信只有是做过一点面向对象开发的敌人都会多多少少应用过。因为真的十分常见
- 一些框架中常常会有某些性能类有初始化的性能,在初始化的函数中都会调用很多外部的其余函数,这其实也是一种模板办法模式的利用
- 模板办法模式能够很不便的实现钩子函数。就像很多模板或者开源零碎中给你筹备好的钩子函数。比方某些博客开源程序会预留一些广告位或者非凡地位的钩子函数让使用者本人按需实现
- 模板办法模式实用于:一次性实现一个算法中不变的局部,并将可变的局部留给子类来实现;将子类中公共的行为提取进去并集中到父类中;管制子类的扩大;
- 这个模式体现了一个叫“好莱坞法令”的准则,那就是“别找咱们,咱们来找你”
在公司中,我十分的推崇麻利式的项目管理,当然,这里也不是说传统的项目管理有如许不好,只是麻利更适宜咱们这种短平快的公司。在麻利中,咱们采纳的是 Scurm 框架,它其实就是一个模板。它定义了四种会议、三种人员、三个工具。在每个我的项目的具体实现中,咱们都会恪守这些规定,但具体的实现又不会一样。比方有时咱们是一周一个迭代,有时是一个月一个迭代。有时咱们不须要回顾会议,而是将回顾和评审会议放在了一起进行。不论怎么样,咱们会在 Scurm 的根底上进行灵便的我的项目开发。而做为领导的我,只须要在每个我的项目中调取 Scurm 的根本流程就能够了。所以说,公司的弱小和大家的学习是分不开的,好用的货色当然要时刻学习分享并利用啦!!
残缺代码:https://github.com/zhangyue0503/designpatterns-php/blob/master/20.template-method/source/template-method.php
实例
不发短信了,这次咱们实现的是一个 Cache 类的初始化局部。就像上文说过的一些框架中的工具类。个别 Cache 咱们会应用 Memcached 或者 Redis 来实现,所以咱们抽取一个公共 Cache 类,而后让 Memcached 和 Redis 的 Cache 实现类都继承它。在公共类中,通过模板办法来进行实现类的一些初始化工作,这些工作由父类对立调用,实现类只须要实现每一个步骤的具体内容就能够了。
缓存类图
残缺源码:https://github.com/zhangyue0503/designpatterns-php/blob/master/20.template-method/source/template-method-cache.php
<?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();
阐明
- 这样一个简略的缓存类咱们就实现了。是不是和很多框架中的代码十分相似。
- 子类只须要定义本人的实现就能够了,剩下的反复代码都让父类去实现,如果没有父类,它们都须要本人实现一个 init()办法
- 当然,须要减少其它的实现类时,也只须要继承这个 Cache 父类后实现本人的实现就能够了,客户端面对这些实现类都能十分轻松,因为它们晓得本人只须要先调用一下初始化办法能够应用这个类了,不论是哪一个实现类都是一样的
下期看点
模板办法模式是不是也非常简单。最次要的是这样的设计模式跟咱们的生存很靠近,在咱们的工作学习过程会非常容易见到并应用到。这样的模式几乎不能挂在罕用设计模式的标签下,因为它比罕用更罕用。好了,咱们的进度还不错哟,下一个模式正等着咱们呢,它可是赫赫有名的 单例模式。
各自媒体平台均可搜寻【硬核项目经理】