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.pswp.cn/news/373721.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/373721.shtml
英文地址,請注明出處:http://en.pswp.cn/news/373721.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

linux系統硬件配置查看方法

一&#xff1a;查看cpu more /proc/cpuinfo | grep "model name" grep "model name" /proc/cpuinfo 如果覺得需要看的更加舒服 grep "model name" /proc/cpuinfo | cut -f2 -d: 二&#xff1a;查看內存 grep MemTotal /proc/meminfo grep MemT…

java String源碼學習

public final class Stringimplements java.io.Serializable, Comparable<String>, CharSequence {/**char數組用于字符的存儲 */private final char value[];/** 緩存string的hash碼 */private int hash; // Default to 0public String() {/**無參構造函數,打印值為&quo…

JBoss AS 7.1.0.Final“ Thunder”發布-Java EE 6 Full Profile認證!

在JBoss AS7上進行了大約一年的開發后&#xff0c;我們現已發布7.1.0.Final“ Thunder” &#xff01; 可從此處的通常位置下載該文件。 對于JBoss AS7團隊來說&#xff0c;這是一個非常大的成就&#xff0c;我們為此版本感到非常自豪。 這個版本包含了7.1.0.CR1b的許多錯誤修復…

數據庫建表練習(10.11作業)

轉載于:https://www.cnblogs.com/HRZJ/p/5951897.html

天干地支計算公式_天干地支主怎樣計算?

回答&#xff1a;少女時代級別&#xff1a;碩士研究生2009-01-08 20:34:04來自&#xff1a;貴州省貴陽市我國古代是用天干地支來紀年的&#xff0c;現代社會已很少使用。一來現今社會已經離不開國際化&#xff0c;沿用老的歷法已經不現實&#xff1b;二來天干地支在民間多用于算…

從程序員到CTO的Java技術路線圖

時間:2013-05-29 17:39來源:www.chengxuyuans.com在技術方面無論我們怎么學習&#xff0c;總感覺需要提升自已不知道自己處于什么水平了。但如果有清晰的指示圖供參考還是非常不錯的&#xff0c;這樣我們清楚的知道我們大概處于那個階段和水平。 Java程序員 高級特性 反射、泛型…

Linux的網卡相關

檢測linux下網卡是否正常 1.dmesg | grep eth 如果出現以下 eth0: link up 說明是網卡正常的 eth0: registered as PCnet/PCI II 79C970Aeth0: link upeth0: no IPv6 routers present 2.如果所用網卡是pcI總線的 。用命令&#xff1a;lspci 能看到網卡是存在的。 3.用ethtool…

設置Spring 3開發環境

本教程簡要說明了如何設置典型的環境來開發基于Spring的應用程序。 除了可以正常工作的Windows XP客戶端具有足夠的CPU能力和內存外&#xff0c;本教程沒有其他先決條件。 在教程中&#xff0c;我們將需要安裝以下組件&#xff1a; Java 6 JDK更新26 用于Java EE開發人員的Ecl…

3. 跟蹤標記 (Trace Flag) 1204, 1222 抓取死鎖信息

跟蹤標記&#xff1a;1204/1222 功能及用途&#xff1a; 捕獲SQL Server死鎖信息&#xff0c;并自動存放到錯誤日志(ERRORLOG)中。 舉例&#xff1a; USE tempdb GO CREATE TABLE t1(id int) INSERT t1 SELECT 1CREATE TABLE t2(id int) INSERT t2 SELECT 1 GO --開啟1204/1222…

postgresql建表帶注釋_postgresql建表帶自增id和注釋語句

work是表名&#xff0c;nextval(work_myid_seq::regclass)這個是自增id的設置CREATE TABLE "public"."work" ("id" int8 NOT NULL DEFAULT nextval(work_myid_seq::regclass),"wid" int8,"address" varchar(100) COLLATE &q…

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…

5. Longest Palindromic Substring

更新&#xff1a; 之前那種dp太笨重了有個非常的輕巧的做法&#xff0c;原理都是一樣的。 轉移方程不變&#xff0c;但是不需要特別的初始化 判斷某個格子是不是true&#xff0c;是 1.要么長度小于3&#xff0c;要么dp[start1][end-1]true 2.并且s.charAt(start) s.charAt(end…

Java中的定制國際化(i18n)

國際化&#xff08;i18n&#xff09;在我們的軟件項目中非常重要。 它主要帶來以下好處&#xff1a; 將UI字符串外部化為除代碼文件之外的外部文件&#xff0c;以及易于管理的UI內容。 支持多種語言。 在這篇文章中&#xff0c;將為Eclipse和Java項目提供一個簡短的i18n實際示…

SEO 百度后臺主動推送鏈接

實踐步驟&#xff0c;先用爬蟲程序將本網站的所有連接爬取出來&#xff0c;再用python文件處理程序把爬蟲來的東東整理成一行一個鏈接的文本格式。再用postman接口測試工具&#xff0c;使用post方式&#xff0c;將所有的鏈接post過去&#xff0c;這樣主動推送是最為快速的提交方…

linux版本 如何查kali_000_Kali Linux版本查看和apt源配置

1.查看系統版本# cat /etc/issue# lsb_release -a2.查看內核信息# uname -a3.更新源# cp /etc/apt/source.list{,.bak}# vim /etc/apt/sources.list//備注&#xff1a;國外源速度太慢&#xff0c;這里禁止&#xff1b;網絡中的部分源已經過期&#xff0c;建議更換其它源。# kal…

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; //字符串拼…

Apache Camel 2.9發布–十大變化

在2011年的最后一天&#xff0c;阿帕奇駱駝制品被成功地推到了中央行銷倉庫&#xff0c;距離香檳酒瓶破裂并進入2012年僅1.5個小時之遙。 2.9版是創紀錄的發行版&#xff0c;自5個月前發布2.8版以來&#xff0c;已解決了約500張JIRA票證。 以下是10個最明顯的改進和新功能的分…

HTML5筆記——formData

注&#xff1a;formData中的數據在控制臺上的console里面是打印不出來的&#xff0c;只能在控制臺的network里面查看到具體的發送數據和發送選項 文章出處&#xff1a;夢想天空 XMLHttpRequest Level 2 添加了一個新的接口——FormData。利用 FormData 對象&#xff0c;我們可以…

JavaScript 學習隨記——==和===及常見元素的真假值

“” 和 “” 符合的使用 <script>/*** 表示可以經過自動轉換&#xff0c;比較的是數值*///example01if(1 true && false 0 && true 1){console.log(1true);console.log(" 比較的是等號兩邊數據的值是否相等&#xff08;可以經過自動轉換&#…