hyperf中的設計模式(一)

2021-10-23 23:25:18 字數 3073 閱讀 3121

hyperf簡介

2.0 介紹

hyperf 是基於 swoole 4.5+ 實現的高效能、高靈活性的 php 協程框架,內建協程伺服器及大量常用的元件,效能較傳統基於 php-fpm 的框架有質的提公升,提供超高效能的同時,也保持著極其靈活的可擴充套件性,標準元件均基於 psr 標準 實現,基於強大的依賴注入設計,保證了絕大部分元件或類都是 可替換 與 可復用 的。

框架元件庫除了常見的協程版的 mysql 客戶端、redis 客戶端,還為您準備了協程版的 eloquent orm、websocket 服務端及客戶端、json rpc 服務端及客戶端、grpc 服務端及客戶端、zipkin/jaeger (opentracing) 客戶端、guzzle http 客戶端、elasticsearch 客戶端、consul 客戶端、etcd 客戶端、amqp 元件、apollo 配置中心、阿里雲 acm 應用配置管理、etcd 配置中心、基於令牌桶演算法的限流器、通用連線池、熔斷器、swagger 文件生成、swoole tracker、檢視引擎、snowflake 全域性 id 生成器 等元件,省去了自己實現對應協程版本的麻煩。

hyperf 還提供了 基於 psr-11 的依賴注入容器、註解、aop 面向切面程式設計、基於 psr-15 的中介軟體、自定義程序、基於 psr-14 的事件管理器、redis/rabbitmq 訊息佇列、自動模型快取、基於 psr-16 的快取、crontab 秒級定時任務、國際化、validation 表單驗證器 等非常便捷的功能,滿足豐富的技術場景和業務場景,開箱即用。

1.單例模式(singleton)

模式定義

簡單說來,單例模式的作用就是保證在整個應用程式的生命週期中,任何乙個時刻,單例類的例項都只存在乙個,同時這個類還必須提供乙個訪問該類的全域性訪問點。 常見使用例項:資料庫聯結器;日誌記錄器(如果有多種用途使用多例模式);鎖定檔案。

uml類圖

單例模式類圖

**示例:

hyperf中的單例模式

在傳統的 php-fpm 的框架裡,會習慣提供乙個 abstractcontroller 或其它命名的 controller 抽象父類,然後定義的 controller 需要繼承它用於獲取一些請求資料或進行一些返回操作,在 hyperf 裡是 不能這樣做 的,因為在 hyperf 內絕大部分的物件包括 controller 都是以 單例(singleton) 形式存在的,這也是為了更好的復用物件,而對於與請求相關的資料在協程下也是需要儲存到 協程上下文(context) 內的,所以在編寫**時請務必注意 不要 將單個請求相關的資料儲存在類屬性內,包括非靜態屬性。

2.簡單工廠模式(****** factory)

模式定義

簡單工廠的作用是例項化物件,而不需要客戶了解這個物件屬於哪個具體的子類。簡單工廠例項化的類具有相同的介面或者基類,在子模擬較固定並不需要擴充套件時,可以使用簡單工廠。

uml類圖

**示例:

hyperf中的簡單工廠模式

hyperf中server的建立由類serve***ctory完成,通過配置引數建立http_server或websocket_server等。**如下:hyperf\server\serve***ctory

namespace

hyperf\server

;use

hyperf\server\entry\eventdispatcher

;use

hyperf\server\entry\logger

;use

psr\container\containerinte***ce

;use

psr\eventdispatcher\eventdispatcherinte***ce

;use

psr\log\loggerinte***ce

;class

serve***ctory

public

function

configure

(array

$config

)public

function

start()

public

function

getserver()

: serverinte***ce

return

$this

->

server;}

public

function

setserver

(server $server

): self

public

function

geteventdispatcher()

: eventdispatcherinte***ce

return

$this

->

getdefaulteventdispatcher()

;}public

function

seteventdispatcher

(eventdispatcherinte***ce $eventdispatcher

): self

public

function

getlogger()

: loggerinte***ce

return

$this

->

getdefaultlogger()

;}public

function

setlogger

(loggerinte***ce $logger

): self

private

function

getdefaulteventdispatcher()

: eventdispatcher

private

function

getdefaultlogger()

: logger

}

spring中的設計模式(一)

在專案開發中,由a方先提供api介面,b方呼叫 此時a方將自己的實現類實現api介面 b方同時也編寫實現類實現api介面,但不需要真的實現介面中的邏輯,只需呼叫父介面中的方法即可 圖 這時暴露出來的只有介面api和 類b,b提供了其他物件呼叫a的 b裡面具有對實現類a的方法的控制權,可以控制他什麼時...

spring中的設計模式(一)

在專案開發中,由a方先提供api介面,b方呼叫 此時a方將自己的實現類實現api介面 b方同時也編寫實現類實現api介面,但不需要真的實現介面中的邏輯,只需呼叫父介面中的方法即可 圖 這時暴露出來的只有介面api和 類b,b提供了其他物件呼叫a的 b裡面具有對實現類a的方法的控制權,可以控制他什麼時...

Spring中的設計模式(一) 工廠模式

場景 以牛奶為例,有蒙牛 伊利 愛慕希等品牌。public inte ce milk 產品實現介面 public class menniu implements milk public class aimuxi implements milk public class yili implements...