时间:2023-06-11 20:42:01 | 来源:网站运营
时间:2023-06-11 20:42:01 来源:网站运营
PHP设计模式之模板方法模式:模板方法模式,也是我们经常会在不经意间有会用到的模式之一。这个模式是对继承的最好诠释。当子类中有重复的动作时,将他们提取出来,放在父类中进行统一的处理,这就是模板方法模式的最简单通俗的解释。就像我们平时做项目,每次的项目流程实都差不多,都有调研、开发、测试、部署上线等流程。而具体到每个项目中,这些流程的实现又不会完全相同。这个流程,就像是模板方法,让我们每次都按照这个流程进行开发。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();
在客户端的调用中,实例化子类,但调用的是子类所继承的父类的模板方法。就可以实现统一的算法调用了。缓存类图完整源码:https://github.com/zhangyue0503/designpatterns-php/blob/master/20.template-method/source/template-method-cache.php
<?phpabstract 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();
说明
关键词:模式,方法,模板,设计