淺談PHP中的中介者模式
在先前的文章《深入淺析PHP中的組合模式》中我們介紹了PHP中的組合模式,以下這篇文章帶大家了解一下PHP設計模式中的中介者模式。
上回說道,我們在外打工的經常會和一類人有很深的接觸,那就是房產仲介。大學畢業後馬上就能在喜歡的城市買到房子的X二代不在我們的考慮範圍內哈。既然需要長期的租房,那麼因為工作或生活的變動,不可避免的一兩年或三五年就要和房仲打一次交道。有的時候,我們租房不一定會知道房主的訊息,房主也不用知道我們的訊息,全部都由中介來處理。在這裡,中介就成為了我們溝通的橋樑,這種情況其實就像是房主出國了或者在外地有事兒而將房子完全的託管到了中介手中。類似於這種情況,在程式碼世界中,就是中介者模式的典型應用。
Gof類別圖及解釋
GoF定義:用一個中介物件來封裝一系列的物件互動。中介者使各物件不需要明確地相互引用,從而使其耦合鬆散,而且可以獨立地改變它們之間的交互作用
GoF類別圖
程式碼實作
abstract class Mediator { abstract public function Send(String $message, Colleague $colleague); } class ConcreteMediator extends Mediator { public $colleague1; public $colleague2; public function Send(String $message, Colleague $colleague) { if ($colleague == $this->colleague1) { $this->colleague2->Notify($message); } else { $this->colleague1->Notify($message); } } }
抽象的中介者和具體的實現,在這裡,我們假定有固定的兩個同事類,讓他們互相對話,所以進入的同事是1的時候,就去調用2的Notify方法,相當於是讓2接收到了1發來的消息
abstract class Colleague { protected $mediator; public function __construct(Mediator $mediator) { $this->mediator = $mediator; } } class ConcreteColleague1 extends Colleague { public function Send(String $message) { $this->mediator->Send($message, $this); } public function Notify(String $message) { echo "同事1得到信息:" . $message, PHP_EOL; } } class ConcreteColleague2 extends Colleague { public function Send(String $message) { $this->mediator->Send($message, $this); } public function Notify(String $message) { echo "同事2得到信息:" . $message; } }
同事類及具體的實現,這裡我們要確認的一點就是,每一個同事類,只認識中介者,並不認識另外的同事類,這就是中介者的特點,雙方不用認識。
$m = new ConcreteMediator(); $c1 = new ConcreteColleague1($m); $c2 = new ConcreteColleague2($m); $m->colleague1 = $c1; $m->colleague2 = $c2; $c1->Send("吃过饭了吗?"); $c2->Send("没有呢,你打算请客?");
客戶端的呼叫就比較很簡單啦!
- 是不是覺得這個模式很適合做一些通訊類別的產品?沒錯,聊天社交、sns、直播之類的都很合適,因為這個模式就是能讓使用者與使用者之間解耦,不需要讓一個使用者去維護所有有關聯的使用者物件
- #因為不需要使用者去維繫關係,所以也就順便解決了關係之間的多對多維護的問題,同時,也不需要去修改用戶類來進行關係的變更,保持了用戶類的良好封裝
- 但是,中介者集中維護可能導致這個類別過於複雜和龐大
- 所以,模式不是萬能的,一定要弄清楚業務場景進行取捨地使用
- 中介者適用於一群組物件以定義良好但是複雜的方式進行溝通的場合,以及想自訂一個分佈在多個類別中的行為,而又不想產生太多子類別的場合
作為一位企業家,深知專案管理的重要性,而專案經理,在許多場合下就是一名中介者的角色。從組織角度來看,一個專案的開始和結束,身為老闆的我並不需要關心是由誰來具體編碼實現,我要溝通的人只是專案經理。同理,其他輔助部門包括財務、人事、行政等,他們也不關心誰來寫程式碼,只需要和專案經理交流了解專案的情況以及需要配合的內容。在專案團隊中,寫程式碼的人呢?也不需要知道誰來給他薪水或考勤問題出在哪裡,這一切都交給專案經理解決就好了。所以說,專案經理負責制的專案開發,就是中介者模式的典型應用。我們的手機工廠之所以發展的如此之快,也多虧了這些專案經理們,晚上請他們吃大餐去咯~~~
完整程式碼:https:// github.com/zhangyue0503/designpatterns-php/blob/master/15.mediator/source/mediator.php
實例
#這回我們不發簡訊了,實現一個聊天室吧。一個簡單的線上聊天室,需求就是讓進入聊天室的使用者都可以在線上聊天,讓我們來看看使用中介者模式來如何實現這個聊天室吧!
聊天室類別圖
#完整原始碼:https://github.com/zhangyue0503/designpatterns-php /blob/master/15.mediator/source/mediator-webchat.php
<?php abstract class Mediator { abstract public function Send($message, $user); } class ChatMediator extends Mediator { public $users = []; public function Attach($user) { if (!in_array($user, $this->users)) { $this->users[] = $user; } } public function Detach($user) { $position = 0; foreach ($this->users as $u) { if ($u == $user) { unset($this->users[$position]); } $position++; } } public function Send($message, $user) { foreach ($this->users as $u) { if ($u == $user) { continue; } $u->Notify($message); } } } abstract class User { public $mediator; public $name; public function __construct($mediator, $name) { $this->mediator = $mediator; $this->name = $name; } } class ChatUser extends User { public function Send($message) { $this->mediator->Send($message . '(' . $this->name . '发送)', $this); } public function Notify($message) { echo $this->name . '收到消息:' . $message, PHP_EOL; } } $m = new ChatMediator(); $u1 = new ChatUser($m, '用户1'); $u2 = new ChatUser($m, '用户2'); $u3 = new ChatUser($m, '用户3'); $m->Attach($u1); $m->Attach($u3); $m->Attach($u2); $u1->Send('Hello, 大家好呀!'); // 用户2、用户3收到消息 $u2->Send('你好呀!'); // 用户1、用户3收到消息 $m->Detach($u2); // 用户2退出聊天室 $u3->Send('欢迎欢迎!'); // 用户1收到消息
說明
- 有沒有發現,中介者就是這個“聊天室”,由它來進行訊息的傳遞轉移
- 這裡由於不固定用戶人數,因此是一個數組維護的,當用戶發送訊息的時候,除了他自己,其他人都收到了這條訊息
- 聊天室可以自由地進出用戶,說實話,這個例子真的很像一個已經差不多實現功能了的聊天應用哦
- 果然中介者模式真的很適合通訊方面的應用,但是,如果進入的用戶非常多,$users列表就會越來越臃腫了哦,這就是上文中所述的中介者模式的問題所在
原文網址:https://juejin.cn/post/6844903975192363015
作者:硬核心專案經理
#推薦學習:《PHP影片教學》
以上是淺談PHP中的中介者模式的詳細內容。更多資訊請關注PHP中文網其他相關文章!

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

PHP 8.4 帶來了多項新功能、安全性改進和效能改進,同時棄用和刪除了大量功能。 本指南介紹如何在 Ubuntu、Debian 或其衍生版本上安裝 PHP 8.4 或升級到 PHP 8.4

Visual Studio Code,也稱為 VS Code,是一個免費的原始碼編輯器 - 或整合開發環境 (IDE) - 可用於所有主要作業系統。 VS Code 擁有大量針對多種程式語言的擴展,可以輕鬆編寫

JWT是一種基於JSON的開放標準,用於在各方之間安全地傳輸信息,主要用於身份驗證和信息交換。 1.JWT由Header、Payload和Signature三部分組成。 2.JWT的工作原理包括生成JWT、驗證JWT和解析Payload三個步驟。 3.在PHP中使用JWT進行身份驗證時,可以生成和驗證JWT,並在高級用法中包含用戶角色和權限信息。 4.常見錯誤包括簽名驗證失敗、令牌過期和Payload過大,調試技巧包括使用調試工具和日誌記錄。 5.性能優化和最佳實踐包括使用合適的簽名算法、合理設置有效期、

字符串是由字符組成的序列,包括字母、數字和符號。本教程將學習如何使用不同的方法在PHP中計算給定字符串中元音的數量。英語中的元音是a、e、i、o、u,它們可以是大寫或小寫。 什麼是元音? 元音是代表特定語音的字母字符。英語中共有五個元音,包括大寫和小寫: a, e, i, o, u 示例 1 輸入:字符串 = "Tutorialspoint" 輸出:6 解釋 字符串 "Tutorialspoint" 中的元音是 u、o、i、a、o、i。總共有 6 個元

本教程演示瞭如何使用PHP有效地處理XML文檔。 XML(可擴展的標記語言)是一種用於人類可讀性和機器解析的多功能文本標記語言。它通常用於數據存儲

靜態綁定(static::)在PHP中實現晚期靜態綁定(LSB),允許在靜態上下文中引用調用類而非定義類。 1)解析過程在運行時進行,2)在繼承關係中向上查找調用類,3)可能帶來性能開銷。

PHP的魔法方法有哪些? PHP的魔法方法包括:1.\_\_construct,用於初始化對象;2.\_\_destruct,用於清理資源;3.\_\_call,處理不存在的方法調用;4.\_\_get,實現動態屬性訪問;5.\_\_set,實現動態屬性設置。這些方法在特定情況下自動調用,提升代碼的靈活性和效率。
