淺談PHP設計模式的責任鏈模式

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

概念: 責任鏈模式又叫做職責鏈模式,是屬於行為型的一種。 責任鏈模式分為兩種: 第一種像工廠流水線,目的就讓每一個環節都進行處理。 第二種像層層審批,如果其中一個對象無法處理,調用下一個對象來進行處理,如果一旦能處理,鏈式就此停止,以此類推,第二種為了程式的健壯性,至少得需要一個兜底的模塊,防止穿透 ...


概念:

責任鏈模式又叫做職責鏈模式,是屬於行為型的一種。
責任鏈模式分為兩種:
第一種像工廠流水線,目的就讓每一個環節都進行處理。
第二種像層層審批,如果其中一個對象無法處理,調用下一個對象來進行處理,如果一旦能處理,鏈式就此停止,以此類推,第二種為了程式的健壯性,至少得需要一個兜底的模塊,防止穿透責任鏈。

適用場景:

對請求參數進行逐層過濾,用於框架的中間件的開發場景(Laravel Middleware)。日誌框架,每個鏈元素自主決定如何處理日誌消息。

優點:

簡化了調用端的操作,調用端無須關心請求的處理細節和請求的傳遞過程,因為請求會自動進行傳遞到整條鏈路。

缺點:

期間實例化的很多的對象,其實完全可以用普通的if去替代。
調試不方便。

//責任鏈模式好像沒有固定的實現方案,只是一種思想,所以實現一個展示活躍類型的的功能。這種方式方便調用端處理,但是依賴在類的內部,不利於後期維護。
//也可以優化調用和實例化在類的外部進行,缺點是會增加調用端的複雜度,有點是可控度更高。到底如何實現這要看應用場景,但是鏈式的思想是一致的。
class shortTerm {
    private function next($time) {
        return (new OneDay())->show($time);
    }

    public function show($time) {
        if($time <= 3) {
            return '剛剛活躍';
        }

        return $this->next($time);
    }
}

class OneDay {
    private function next($time) {
        return (new ThreeDay())->show($time);
    }

    public function show($time) {
        if($time <= 24) {
            return '當天活躍';
        }

        return $this->next($time);
    }
}


class ThreeDay {
    private function next($time) {
        return  (new SevenDay())->show($time);
    }

    public function show($time) {
        if($time <= 72) {
            return '三日內活躍';
        }

        return $this->next($time);
    }
}


class SevenDay {
    public function show($time) {
        return '不活躍';
    }
}

//調用端
echo (new shortTerm())->show(600);

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

-Advertisement-
Play Games
更多相關文章
  • Day1 根據自己的垃圾html+css水平寫出了下麵這個頁面: 首先, 首部的超鏈接都能夠鏈接上, 但是不會[更多]的彈出視窗, 右面的天氣/設置/個人也沒有做, 不會怎麼去調用 中間的圖片和搜索欄能夠正常使用, 搜索欄能夠正常搜索. 但是無法水平垂直居中, 而且, 兩個input無法靠近在一起. ...
  • 相信用過vue的小伙伴,肯定被面試官問過這樣一個問題:在vue中動態的引入圖片為什麼要使用require 有些小伙伴,可能會輕蔑一笑:呵,就這,因為動態添加src被當做靜態資源處理了,沒有進行編譯,所以要加上require, 我倒著都能背出來...... emmm... 乍一看好像說的很有道理啊... ...
  • 通過 JavaScript 在瀏覽器中獲取或設置剪貼板中的內容,常用於一鍵複製或使用網頁油猴複製限制文本 使用 ~~execCommand~~ (已棄用) 寫入文本到剪貼板 document.onclick = function() { let text = 'hello world' let do ...
  • 前言 最近無聊看直播,虎牙廣告是真多,還有一堆ghs直播間經常出現在首頁,不想看到這些直播間,於是想辦法屏蔽直播間。 源碼地址 插件地址 演示 下麵先看看未安裝插件之前 虎牙首頁一堆廣告,視頻自動播放 更過分是一堆ghs,噁心人玩意兒的出現在這裡,真是影響觀看體驗 還有左側推薦欄也很煩 安裝之後: ...
  • 1.4 超鏈接 1.4.1 基礎語法 基礎語法: <a href="網頁地址"> </a> 拓展參數: <a href="網頁地址" target="跳轉方式"> </a> | href | 跳轉鏈接地址 | | | | | target | 鏈接打開方式 | 1.4.2 錨鏈接(id參數) 每個標 ...
  • 為了提高系統吞吐率,也就是提高生產效率,核心觀點如下,系統設計也是如此 在微服務或任何其他基於事件的架構(event-driven-architecture)中,在一些用例中,一個服務可能需要我們對他們自己的本地資料庫進行修改,同時發佈一個事件。然後,該事件會被其他服務所消費。為了擁有一個一致的軟體 ...
  • 您好,我是湘王,這是我的博客園,歡迎您來,歡迎您再來~ 之前說過,AQS(抽象隊列同步器)是Java鎖機制的底層實現。既然它這麼優秀,是騾子是馬,就拉出來溜溜吧。 首先用重入鎖來實現簡單的累加,就像這樣: /** * 用重入鎖實現累加 * * @author 湘王 */ public class M ...
  • 前提 java version "1.8.0_25" 池簡述 軟體開發活動中,我們經常會聽到資料庫連接池、記憶體池、線程池等各種“池”概念,這些“池”到底是什麼東西呢?程式的世界里,我們可以將池簡單的理解為一種容器類數據結構,比如列表。程式處理信息的過程中,可能會依賴某些資源或者對象(暫且統一稱之為對 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...