站長資訊網
        最全最豐富的資訊網站

        深入淺析PHP中的模板方法模式

        在之前的文章《一文了解PHP中的門面模式》中我們介紹了PHP中的門面模式,下面本篇文章帶大家了解一下PHP設計模式中的模板方法模式。

        深入淺析PHP中的模板方法模式

        模板方法模式,也是我們經常會在不經意間有會用到的模式之一。這個模式是對繼承的最好詮釋。當子類中有重復的動作時,將他們提取出來,放在父類中進行統一的處理,這就是模板方法模式的最簡單通俗的解釋。就像我們平時做項目,每次的項目流程實都差不多,都有調研、開發、測試、部署上線等流程。而具體到每個項目中,這些流程的實現又不會完全相同。這個流程,就像是模板方法,讓我們每次都按照這個流程進行開發。

        Gof類圖及解釋

        GoF定義:定義一個操作中的算法的骨架,而將一些步驟延遲到子類中。TemplateMethod使得子類可以不改變一個算法的結構即可重定義該算法的某些特定步驟。

        GoF類圖

        深入淺析PHP中的模板方法模式

        代碼實現

        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實現類都繼承它。在公共類中,通過模板方法來進行實現類的一些初始化工作,這些工作由父類統一調用,實現類只需要實現每一個步驟的具體內容就可以了。

        緩存類圖

        深入淺析PHP中的模板方法模式

        完整源碼: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父類后完成自己的實現就可以了,客戶端面對這些實現類都能非常輕松,因為它們知道自己只需要先調用一下初始化方法可以使用這個類了,不管是哪一個實現類都是一樣的

        原文地址:https://juejin.cn/post/6844903989348139021

        作者:硬核項目經理

        推薦學習:《PHP視頻教程》

        贊(0)
        分享到: 更多 (0)
        網站地圖   滬ICP備18035694號-2    滬公網安備31011702889846號
        主站蜘蛛池模板: 久久福利青草精品资源站免费| 精品国产青草久久久久福利| 国产精品免费久久久久电影网| 亚洲精品高清无码视频| 国产精品成人99久久久久| 国产精品VA在线观看无码不卡| 亚洲国产精品丝袜在线观看| 91亚洲国产成人久久精品 | 国产成人精品无码免费看| 日韩精品无码永久免费网站 | 国产福利电影一区二区三区,亚洲国模精品一区 | 久久精品国产亚洲AV大全| 91久久精品国产成人久久| 国产精品视频一区二区三区无码| 亚洲?V无码成人精品区日韩| 国产精品二区观看| 91精品视频在线| 久久精品成人国产午夜| 国产成人精品免费久久久久| 久久国产欧美日韩精品| 午夜精品久久久久久久久| 日韩精品一区二区三区不卡| 精品国精品国产自在久国产应用男| 中文字幕亚洲综合精品一区| 日本精品卡一卡2卡3卡四卡| 国产精品嫩草视频永久网址| 97精品人妻系列无码人妻| 国产欧美亚洲精品A| 久久久久久九九99精品| 国产乱人伦偷精品视频免下载| 国产精品福利网站导航| 无码人妻精品一区二区三区66| 香蕉依依精品视频在线播放| 人妻VA精品VA欧美VA| 男女男精品网站免费观看| 久久久久久亚洲精品不卡| 久久精品国产72国产精福利| 欧美成人精品一区二三区在线观看| 精品亚洲欧美无人区乱码| 青青草97国产精品免费观看| 四虎精品影库4HUTV四虎|