淺談PHP設計模式的模板方法模式

来源:https://www.cnblogs.com/phpphp/archive/2022/11/10/16878748.html
-Advertisement-
Play Games

簡介: 模板方法模式,是行為型的設計模式。 定義一個操作中的演算法的骨架,而將一些步驟延遲到子類當中,使得子類可以不改變一個演算法的結構即可重新定義該演算法的某些特定步驟。 通俗講,模板方法模式是偏向繼承的設計模式,當子類有重覆的動作時候,可將他們提取出來,放在父類進行處理。 適用場景: 演算法結構相同但是 ...


簡介:

模板方法模式,是行為型的設計模式。
定義一個操作中的演算法的骨架,而將一些步驟延遲到子類當中,使得子類可以不改變一個演算法的結構即可重新定義該演算法的某些特定步驟。
通俗講,模板方法模式是偏向繼承的設計模式,當子類有重覆的動作時候,可將他們提取出來,放在父類進行處理。

適用場景:

演算法結構相同但是演算法不同的場景下使用,父類控制整體,子類具體實現。

優點:

  1. 體現了繼承的優點,實例化子類,子類繼承的是父類的模板方法,可以實現統一格式的演算法調用,並避免重覆。
  2. 方便實現鉤子函數。
  3. 用戶只需要實現子類的部分邏輯,實例化父類就可以完成功能。
  4. 符合開閉原則。
  5. 方便擴展。

缺點:

受到父類約束,繼承讓耦合度變大,某些場景下會有局限性。

其它:

相比較與策略模式相似。
但是模板方法的定位是父類控制整體,子類具體實現。為了優雅的擴展代碼而生。
策略模式的定位是根據情況選定合適的演算法。

代碼

//抽象出來一個下載類
abstract class DownloadSongs {
    protected $singer;
    protected $operator;
    public function __construct($singer) {
        $this->singer = $singer;
    }

    //前置鉤子
    protected function beforeDownloadHook() {
        echo '充值' . $this->operator . '會員' . PHP_EOL;
    }

    //後置鉤子
    protected function afterDownloadHook() {
        echo $this->operator . '還算好用,就是要充會員' . PHP_EOL;
    }

    //組合調用
    public function download() {
        $this->beforeDownloadHook();
        $this->downloadMusic();
        $this->afterDownloadHook();
    }

    //具體實現讓子類進行
    abstract protected function downloadMusic();
}


//酷狗類,實現父類的兩個方法
class KuGouMusic extends DownloadSongs {
    protected $operator = '酷狗';
    protected function downloadMusic() {
        echo '從酷狗音樂上下載' . $this->singer . '的歌曲' . PHP_EOL;
    }
}


//QQ類,實現父類的兩個方法
class QQMusic extends DownloadSongs {
    protected $operator = 'QQ';
    protected function downloadMusic() {
        echo '從QQ音樂上下載' . $this->singer . '的歌曲' . PHP_EOL;
    }
}


//調用端=======================================================================
(new KuGouMusic('鳳凰傳奇'))->download();
(new QQMusic('英文'))->download();

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 查看docker鏡像 可以先查看docker下是否存在nginx鏡像,使用如下這些命令查看: docker images: 列出所有鏡像。 docker images nginx: 列出所有nginx鏡像,不同版本等等。 docker search nginx: 搜索查看所有nginx鏡像信息。 拉 ...
  • 一、節點概述 網頁中的所有內容都是節點(標簽、屬性、文本、註釋等),使用node表示。HTML、DOM樹中的所有節點均可通過JavaScript進行訪問,所有HTML元素(節點)均可被修改,也可以創建或刪除。 利用DOM樹可以把節點劃分為不同的層級關係,常見的是父子兄層級關係。 一般地,節點至少擁有 ...
  • 訪問者模式被認為是最複雜的設計模式,並且使用頻率不高。大多情況下,你不需要使用訪問者模式,但是一旦需要使用它時,那就真的需要使用了。 ...
  • 第一章 LinkedList源碼分析 目標: 理解LinkedList的底層數據結構 深入源碼掌握LinkedList查詢慢,新增快的原因 一、LinkedList的簡介 List介面的鏈接列表實現。實現所有可選的列表操作,並且允許所有元素(包括null)。除了實現List介面外,LinkedLis ...
  • jdk線程池ThreadPoolExecutor工作原理解析(自己動手實現線程池)(一) 線程池介紹 在日常開發中經常會遇到需要使用其它線程將大量任務非同步處理的場景(非同步化以及提升系統的吞吐量),而在使用線程的過程中卻存在著兩個痛點。 在java等很多主流語言中每個邏輯上的線程底層都對應著一個系統線 ...
  • sizeof和strlen在C語言中常用來計算字元大小和長度,在應用中卻有著本質的區別。 sizeof是C語言中的關鍵字,其作用是返回一個對象或類型所占的記憶體位元組數。使用方式為: int i; sizeof(int); *//值為4*` sizeof(i); *//值為4,等價於sizeof(int ...
  • 本章我們正式開始學習Python的入門課程。 在學習Python之前,你要做的第一件事,就是安裝Python環境。 由於Python官方已不再維護Python2.x,所以本系列課程將使用最新的Python3.x版本作為Python環境,不再考慮Python2.x版本的相容性。讓我們面向未來,擁抱Py ...
  • 只有繼承於object的新式類才能有__new__方法,__new__方法在創建類實例對象時由Python解釋器自動調用,一般不用自己定義,Python預設調用該類的直接父類的__new__方法來構造該類的實例,如果該類的父類也沒有重寫__new__,那麼將一直按此規矩追溯至object的__new ...
一周排行
    -Advertisement-
    Play Games
  • .Net8.0 Blazor Hybird 桌面端 (WPF/Winform) 實測可以完整運行在 win7sp1/win10/win11. 如果用其他工具打包,還可以運行在mac/linux下, 傳送門BlazorHybrid 發佈為無依賴包方式 安裝 WebView2Runtime 1.57 M ...
  • 目錄前言PostgreSql安裝測試額外Nuget安裝Person.cs模擬運行Navicate連postgresql解決方案Garnet為什麼要選擇Garnet而不是RedisRedis不再開源Windows版的Redis是由微軟維護的Windows Redis版本老舊,後續可能不再更新Garne ...
  • C#TMS系統代碼-聯表報表學習 領導被裁了之後很快就有人上任了,幾乎是無縫銜接,很難讓我不想到這早就決定好了。我的職責沒有任何變化。感受下來這個系統封裝程度很高,我只要會調用方法就行。這個系統交付之後不會有太多問題,更多應該是做小需求,有大的開發任務應該也是第二期的事,嗯?怎麼感覺我變成運維了?而 ...
  • 我在隨筆《EAV模型(實體-屬性-值)的設計和低代碼的處理方案(1)》中介紹了一些基本的EAV模型設計知識和基於Winform場景下低代碼(或者說無代碼)的一些實現思路,在本篇隨筆中,我們來分析一下這種針對通用業務,且只需定義就能構建業務模塊存儲和界面的解決方案,其中的數據查詢處理的操作。 ...
  • 對某個遠程伺服器啟用和設置NTP服務(Windows系統) 打開註冊表 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W32Time\TimeProviders\NtpServer 將 Enabled 的值設置為 1,這將啟用NTP伺服器功 ...
  • title: Django信號與擴展:深入理解與實踐 date: 2024/5/15 22:40:52 updated: 2024/5/15 22:40:52 categories: 後端開發 tags: Django 信號 松耦合 觀察者 擴展 安全 性能 第一部分:Django信號基礎 Djan ...
  • 使用xadmin2遇到的問題&解決 環境配置: 使用的模塊版本: 關聯的包 Django 3.2.15 mysqlclient 2.2.4 xadmin 2.0.1 django-crispy-forms >= 1.6.0 django-import-export >= 0.5.1 django-r ...
  • 今天我打算整點兒不一樣的內容,通過之前學習的TransformerMap和LazyMap鏈,想搞點不一樣的,所以我關註了另外一條鏈DefaultedMap鏈,主要調用鏈為: 調用鏈詳細描述: ObjectInputStream.readObject() DefaultedMap.readObject ...
  • 後端應用級開發者該如何擁抱 AI GC?就是在這樣的一個大的浪潮下,我們的傳統的應用級開發者。我們該如何選擇職業或者是如何去快速轉型,跟上這樣的一個行業的一個浪潮? 0 AI金字塔模型 越往上它的整個難度就是職業機會也好,或者說是整個的這個運作也好,它的難度會越大,然後越往下機會就會越多,所以這是一 ...
  • @Autowired是Spring框架提供的註解,@Resource是Java EE 5規範提供的註解。 @Autowired預設按照類型自動裝配,而@Resource預設按照名稱自動裝配。 @Autowired支持@Qualifier註解來指定裝配哪一個具有相同類型的bean,而@Resourc... ...