当前位置: 首页 > 后端技术 > PHP

PHP设计模式的模板方法模式

时间:2023-03-29 18:52:47 PHP

模板方法模式也是我们经常不经意使用的模式之一。这种模式就是对继承的最好诠释。当子类中有重复动作时,将其提取出来放到父类中统一处理。这是对模板方法模式最简单、最通俗的解释。就像我们平时做项目一样,每个项目的流程其实都是一样的,包括调研、开发、测试、部署、上线等流程。而具体到每个项目,这些流程的实现也不会完全一样。这个过程就像一个模板方法,让我们每次都按照这个过程来开发。Gof类图及说明GoF定义:定义一个算法在一个操作中的骨架,将一些步骤推迟到子类中。TemplateMethod使子类可以在不改变算法结构的情况下重新定义算法的某些特定步骤。GoF类图代码实现抽象类AbstractClass{publicfunctionTemplateMethod(){$this->PrimitiveOperation1();$this->PrimitiveOperation2();}抽象公共函数PrimitiveOperation1();abstractpublicfunctionPrimitiveOperation2();}定义一个抽象类,有一个模板方法TemplateMethod(),在这个方法中我们调用了算法运行方法。这些算法抽象方法在子类中实现。classConcreteClassAextendsAbstractClass{publicfunctionPrimitiveOperation1(){echo'具体类A实现方法1',PHP_EOL;}publicfunctionPrimitiveOperation2(){echo'具体类A实现方法2',PHP_EOL;}}classConcreteClassBextendsAbstractClass{publicfunctionPrimitiveOperation1(){echo'具体类B实现方法1',PHP_EOL;}publicfunctionPrimitiveOperation2(){echo'具体B类实现方法2',PHP_EOL;具体的实现类,它们只需要实现父类定义的算法即可。$c=newConcreteClassA();$c->TemplateMethod();$c=newConcreteClassB();$c->TemplateMethod();在客户端的调用中,子类被实例化,但是子类调用的是继承父类的模板方法。可以实现统一的算法调用。相信稍微做过一点面向对象开发的人,都会或多或少的用到模板方法模式。因为在一些框架中真的很常见,一些功能类往往会有初始化函数,在初始化函数中会调用很多其他的内部函数。这实际上是一种模板方法模式。模板方法模式可以很方便。实现钩子函数。就像很多模板或者开源系统中为你准备的钩子函数一样。比如一些博客开源程序会在特殊的位置预留一些广告位或者钩子函数,让用户可以按需实现模板方法,可以通过子类来实现;提取子类中的公共行为,集中到父类中;控制子类的扩展;这种模式体现了一个叫做“好莱坞法则”的原则,即“不要找我们,我们来找你”,在公司里,我极力推荐敏捷项目管理。当然,这并不是说传统的项目管理不好。只是敏捷更适合我们这种短期的公司。在敏捷中,我们使用的是Scurm框架,它其实就是一个模板。它定义了四种会议、三种人和三种工具。在每个项目的具体实施中,我们都会遵守这些规则,但具体的实施方式不会千篇一律。例如,有时我们一周迭代一次,有时一个月迭代一次。有时我们不需要回顾,但我们将回顾和回顾结合起来。不管怎样,我们都会在Scurm的基础上进行灵活的项目开发。作为leader,我只需要在每个项目中调用Scurm的基本流程即可。所以,公司的强大离不开大家的学习。当然,有用的东西要一直学习、分享、应用!!完整代码:https://github.com/zhangyue0503/designpatterns-php/blob/master/20.template-method/source/template-method.php实例不发送短信,这次我们实现一个Cache类初始化部分.就像上面提到的一些框架中的工具类一样。一般我们会使用Memcached或者Redis来实现Cache,所以我们提取一个公共的Cache类,然后让Memcached和Redis的Cache实现类继承。在公共类中,通过模板方法进行实现类的一些初始化工作,这些工作由父类统一调用,实现类只需要实现每一步的具体内容即可。缓存类图完整源码:https://github.com/zhangyue0503/designpatterns-php/blob/master/20.template-method/source/template-method-cache.phpinit();}publicfunctioninit(){$this->GetConfig();$this->OpenConnection();$this->CheckConnection();}抽象公共函数GetConfig();抽象公共函数OpenConnection();abstractpublicfunctionCheckConnection();}classMemcachedCacheextendsCache{publicfunctionGetConfig(){echo'获取Memcached配置文件!',PHP_EOL;$this->config='memcached';}publicfunctionOpenConnection(){echo'Linkmemcached!',PHP_EOL;$this->conn=1;}publicfunctionCheckConnection(){if($this->conn){echo'Memcached连接成功!',PHP_EOL;}else{echo'Memcached连接失败,请检查检查配置项!',PHP_EOL;}}}classRedisCacheextendsCache{publicfunctionGetConfig(){echo'获取Redis配置文件!',PHP_EOL;$this->config='redis';}publicfunctionOpenConnection(){echo'Linkredis!',PHP_EOL;$this->conn=0;}publicfunctionCheckConnection(){if($this->conn){echo'Redis连接成功!',PHP_EOL;}else{echo'Redis连接失败,请检查配置项!',PHP_EOL;}}}$m=newMemcachedCache();$r=新的RedisCache();说明我们实现的这么一个简单的缓存类,和很多框架中的代码是很相似的。子类只需要定义自己的实现,其余重复的代码由父类完成。如果没有父类,它们都需要自己实现一个init()方法。当然,当你需要添加其他实现类时,也可以只需要继承Cache父类,自己完成实现即可。客户可以轻松面对这些实现类,因为他们知道只要先调用初始化方法就可以使用这个类,不管是哪个实现类都是一样的。接下来一点就是模板方法模式也很简单。最重要的是这种设计模式非常贴近我们的生活,在我们的工作和学习过程中会非常容易看到和使用。这样的模式根本不能挂在普通设计模式的标签下,因为它比普通还普通。好吧,我们进展顺利,下一个模式在等着我们,它就是著名的单例模式。各媒体平台均可搜索【硬核项目经理】