php socketconnect连接失败_PHP设计模式之模板方法模式

模板方法模式,也是我们经常会在不经意间有会用到的模式之一。这个模式是对继承的最好诠释。当子类中有重复的动作时,将他们提取出来,放在父类中进行统一的处理,这就是模板方法模式的最简单通俗的解释。就像我们平时做项目,每次的项目流程实都差不多,都有调研、开发、测试、部署上线等流程。而具体到每个项目中,这些流程的实现又不会完全相同。这个流程,就像是模板方法,让我们每次都按照这个流程进行开发。

Gof类图及解释

GoF定义:定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。TemplateMethod使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。

GoF类图

5d07377abf6e3c7f1b2d5ad08df7ef00.png
代码实现
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实现类都继承它。在公共类中,通过模板方法来进行实现类的一些初始化工作,这些工作由父类统一调用,实现类只需要实现每一个步骤的具体内容就可以了。

缓存类图

ac434c6e1fc4dbda8a08467840a23b9d.png

完整源码: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();
说明
  • 这样一个简单的缓存类我们就实现了。是不是和很多框架中的代码非常类似。
  • 子类只需要定义自己的实现就可以了,剩下的重复代码都让父类去完成,如果没有父类,它们都需要自己实现一个init()方法
  • 当然,需要增加其它的实现类时,也只需要继承这个Cache父类后完成自己的实现就可以了,客户端面对这些实现类都能非常轻松,因为它们知道自己只需要先调用一下初始化方法可以使用这个类了,不管是哪一个实现类都是一样的

下期看点

模板方法模式是不是也非常简单。最主要的是这样的设计模式跟我们的生活很接近,在我们的工作学习过程会非常容易见到并使用到。这样的模式简直不能挂在常用设计模式的标签下,因为它比常用更常用。好了,我们的进度还不错哟,下一个模式正等着我们呢,它可是大名鼎鼎的单例模式

===============
关注公众号:【硬核项目经理】获取最新文章
添加微信/QQ好友:【DarkMatterZyCoder/149844827】免费得PHP、项目管理学习资料

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/373721.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数据库建表练习(10.11作业)

转载于:https://www.cnblogs.com/HRZJ/p/5951897.html

从程序员到CTO的Java技术路线图

时间:2013-05-29 17:39来源:www.chengxuyuans.com在技术方面无论我们怎么学习&#xff0c;总感觉需要提升自已不知道自己处于什么水平了。但如果有清晰的指示图供参考还是非常不错的&#xff0c;这样我们清楚的知道我们大概处于那个阶段和水平。 Java程序员 高级特性 反射、泛型…

设置Spring 3开发环境

本教程简要说明了如何设置典型的环境来开发基于Spring的应用程序。 除了可以正常工作的Windows XP客户端具有足够的CPU能力和内存外&#xff0c;本教程没有其他先决条件。 在教程中&#xff0c;我们将需要安装以下组件&#xff1a; Java 6 JDK更新26 用于Java EE开发人员的Ecl…

js中window.onload 与 jquery中$(document.ready()) 测试

js中window.onload 与 jquery中$(document.ready())区别&#xff0c;验证代码如下(调换js代码和Jquer代码书写顺序测试&#xff0c;运行结果一样&#xff0c;因此与代码书写位置没关系)&#xff1a;<html> <head> <script typetext/javascript srcjquery-1.11.1…

Java中的定制国际化(i18n)

国际化&#xff08;i18n&#xff09;在我们的软件项目中非常重要。 它主要带来以下好处&#xff1a; 将UI字符串外部化为除代码文件之外的外部文件&#xff0c;以及易于管理的UI内容。 支持多种语言。 在这篇文章中&#xff0c;将为Eclipse和Java项目提供一个简短的i18n实际示…

SEO 百度后台主动推送链接

实践步骤&#xff0c;先用爬虫程序将本网站的所有连接爬取出来&#xff0c;再用python文件处理程序把爬虫来的东东整理成一行一个链接的文本格式。再用postman接口测试工具&#xff0c;使用post方式&#xff0c;将所有的链接post过去&#xff0c;这样主动推送是最为快速的提交方…

nyoj--127--星际之门(一)(生成树的数量)

星际之门&#xff08;一&#xff09; 时间限制&#xff1a;3000 ms | 内存限制&#xff1a;65535 KB难度&#xff1a;3描述公元3000年&#xff0c;子虚帝国统领着N个星系&#xff0c;原先它们是靠近光束飞船来进行旅行的&#xff0c;近来&#xff0c;X博士发明了星际之门&…

Oracle 常用的一些函数

字符函数 SELECT UPPER(hello WORLD) FROM DUAL; //将小写字母变为大写字母SELECT LOWER(hello WORLD) FROM DUAL; //将大写字母变为小心字母SELECT INITCAP(hello WORLD) FROM DUAL; //将字符串的首字母大写SELECT CONCAT(hello, world) FROM DUAL; //字符串拼…

JavaScript 学习随记——==和===及常见元素的真假值

“” 和 “” 符合的使用 <script>/*** 表示可以经过自动转换&#xff0c;比较的是数值*///example01if(1 true && false 0 && true 1){console.log(1true);console.log(" 比较的是等号两边数据的值是否相等&#xff08;可以经过自动转换&#…

JavaScript学习随记——数组一

数组的创建及length属性 <script type"text/javascript" charset"utf-8">// 数组创建方式一,此种方式写的时候比较麻烦var arrnew Array();// 数组创建方式二var arr [1,2,3,4,true,str,new Date()];console.log("arr.length&#xff1a;"…

Spring和石英:多作业计划服务

作业调度对于应用程序来说是如此重要。 尤其是在大型项目中&#xff0c;处理大量工作可能是一个问题。 Spring和Quartz为解决该问题带来了巨大的好处。 本文介绍了如何通过使用Spring和Quartz轻松地计划多个作业。 二手技术&#xff1a; JDK 1.6.0_21 春天3.1.1 石英1.8.5 M…

反射的简单应用

首先有一个类 1 using System;2 using System.Collections.Generic;3 using System.Linq;4 using System.Text;5 using System.Threading.Tasks;6 7 namespace ConsoleApplication18 {9 public class demo 10 { 11 public string name "程序员"; 12…

JavaFX 2.0示例介绍书

我最近完成了有关JavaFX 2.0 SDK新版本的书的编写&#xff0c;并且已经将它放在您附近的书店&#xff08; Amazon &#xff09;的书架上。 该书将逐步指导您完成JavaFX 2.0的来龙去脉。 当您遇到一章时&#xff0c;将看到一些菜谱&#xff0c;这些菜谱将带来一个问题&#xff0…

双纵坐标的绘图命令_工程师绘图必备软件——OriginLab 2019b

点击右上角关注&#xff0c;尽享后续精品软件OriginLab 2019b是OriginLab OriginPro 2019版本的加强版&#xff0c;这个软件对于许多人来讲并不陌生&#xff0c;可以说是科学家和工程师的绘图必备软件。新的版本也带来许多改变&#xff0c;软件拥有多种功能&#xff0c;这个版本…

Spring远程支持和开发RMI服务

Spring远程支持简化了启用远程服务的开发。 当前&#xff0c;Spring支持以下远程技术&#xff1a;远程方法调用&#xff08;RMI&#xff09;&#xff0c;HTTP调用程序&#xff0c;Hessian&#xff0c;Burlap&#xff0c;JAX-RPC&#xff0c;JAX-WS和JMS。 远程方法调用&#xf…

ToString:身份哈希码的十六进制表示形式

我以前在方便的Apache Commons ToStringBuilder上写过博客&#xff0c;最近有人问我&#xff0c;在生成的String输出中出现的看似神秘的文本是什么构成的。 询问该问题的同事正确地推测出他正在查看的是哈希码&#xff0c;但与他实例的哈希码不匹配。 我解释说ToStringBuilder将…

登录id 黑苹果_黑苹果MacOSCatalina无法登录AppStore修复

先上图&#xff1a;惨红色的提示信息&#xff0c;把你拒之App Store门外&#xff0c;但是对之放弃、不与之斗争不是我们的节奏&#xff0c;请看破敌攻略&#xff1a;1.查看你的“关于本机”-->“概览”-->“系统报告”&#xff0c;如图&#xff1a;找到你的“网络”-->…

Web开发的入门指导

Web开发的入门指导web开发编程技术你点开此文&#xff0c;说明你对Web开发是有兴趣的&#xff0c;或者你正在思考开始学习Web开发。在这里&#xff0c;我会告诉你成为一名Web开发者的路线&#xff0c;是对初学者关于Web开发的指导。这篇文章不会教你如何写代码&#xff0c;而是…

过滤日志中不相关的堆栈跟踪行

我喜欢堆栈痕迹。 不是因为我喜欢错误&#xff0c;而是因为发生错误的那一刻&#xff0c;堆栈跟踪是无价的信息源。 例如&#xff0c;在Web应用程序中&#xff0c;堆栈跟踪向您显示完整的请求处理路径&#xff0c;从HTTP套接字到过滤器&#xff0c;Servlet&#xff0c;控制器&a…

Dijkstra 最短路算法(只能计算出一条最短路径,所有路径用dfs)

上周我们介绍了神奇的只有五行的 Floyd 最短路算法&#xff0c;它可以方便的求得任意两点的最短路径&#xff0c;这称为“多源最短路”。本周来来介绍指定一个点&#xff08;源点&#xff09;到其余各个顶点的最短路径&#xff0c;也叫做“单源最短路径”。例如求下图中的 1 号…