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

        淺談PHP中的中介者模式

        在之前的文章《深入淺析PHP中的組合模式》中我們介紹了PHP中的組合模式,下面本篇文章帶大家了解一下PHP設計模式中的中介者模式。

        淺談PHP中的中介者模式

        上回說道,我們在外打工的經常會和一類人有很深的接觸,那就是房產中介。大學畢業后馬上就能在喜歡的城市買到房子的X二代不在我們的考慮范圍內哈。既然需要長期的租房,那么因為工作或者生活的變動,不可避免的一兩年或者三五年就要和房產中介打一次交道。有的時候,我們租房并不一定會知道房主的信息,房主也不用知道我們的信息,全部都由中介來進行處理。在這里,中介就成為了我們溝通的橋梁,這種情況其實就像是房主出國了或者在外地有事兒而將房子完全的托管到了中介手中。類似于這種情況,在代碼世界中,就是中介者模式的典型應用。

        Gof類圖及解釋

        GoF定義:用一個中介對象來封裝一系列的對象交互。 中介者使各對象不需要顯式地相互引用,從而使其耦合松散,而且可以獨立地改變它們之間的交互

        GoF類圖

        淺談PHP中的中介者模式

        代碼實現

        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

        實例

        這回我們不發短信了,實現一個聊天室吧。一個簡單的在線聊天室,需求就是讓進入聊天室的用戶都可以在線聊天,讓我們來看看使用中介者模式來如何實現這個聊天室吧!

        聊天室類圖

        淺談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視頻教程》

        贊(0)
        分享到: 更多 (0)
        網站地圖   滬ICP備18035694號-2    滬公網安備31011702889846號
        主站蜘蛛池模板: 精品国产AⅤ一区二区三区4区| 久久性精品| 国产精品亚洲高清一区二区| 亚洲AV第一页国产精品| 国产亚洲精品成人a v小说| 99精品视频在线观看免费| 中国精品18videosex性中国| 国产成人精品久久综合| 97久久精品无码一区二区天美| 最新欧美性爱精品一区二区三区| 黄床大片免费30分钟国产精品| 欧洲精品视频在线观看| 国产产无码乱码精品久久鸭| 亚洲精品亚洲人成人网| 久久精品18| 国产精品嫩草影院久久| 欧美精品免费线视频观看视频| 精品国际久久久久999波多野| 亚洲精品无码永久在线观看| 久久精品国产99国产精品| 国产精品区AV一区二区| 欧美精品一区二区三区视频| 国产精品美脚玉足脚交欧美| 91人前露出精品国产| 国产suv精品一区二区33| 精品久久久久香蕉网| 色一乱一伦一图一区二区精品| 中文成人无码精品久久久不卡| 青春草无码精品视频在线观| 久久精品国产亚洲一区二区三区 | 国产精品亚洲一区二区三区在线 | 无码国产69精品久久久久网站| 亚洲精品国产精品乱码不卞| 亚洲国产精品第一区二区三区| 无码精品久久一区二区三区| 亚洲精品tv久久久久久久久久| 亚洲国产精品成人| 在线精品亚洲一区二区| 亚洲精品乱码久久久久久| 无码人妻精品一区二区三区东京热 | 国产成人精品久久亚洲|