溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

PHP中的中介者模式是什么

發(fā)布時間:2021-07-19 08:48:24 來源:億速云 閱讀:129 作者:chen 欄目:編程語言

本篇內(nèi)容介紹了“PHP中的中介者模式是什么”的有關(guān)知識,在實(shí)際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!

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

Gof類圖及解釋

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

GoF類圖

PHP中的中介者模式是什么

代碼實(shí)現(xiàn)

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);
        }
    }
}

抽象出來的中介者和具體的實(shí)現(xiàn),在這里,我們假定有固定的兩個同事類,讓他們互相對話,所以進(jìn)入的同事是1的時候,就去調(diào)用2的Notify方法,相當(dāng)于是讓2接收到了1發(fā)來的消息

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;
    }
}

同事類及具體的實(shí)現(xiàn),這里我們要確認(rèn)的一點(diǎn)就是,每一個同事類,只認(rèn)識中介者,并不認(rèn)識另外的同事類,這就是中介者的特點(diǎn),雙方不用認(rèn)識。

$m = new ConcreteMediator();

$c1 = new ConcreteColleague1($m);
$c2 = new ConcreteColleague2($m);

$m->colleague1 = $c1;
$m->colleague2 = $c2;

$c1->Send("吃過飯了嗎?");
$c2->Send("沒有呢,你打算請客?");

客戶端的調(diào)用就比較很簡單啦!

  • 是不是感覺這個模式很適合做一些通訊類的產(chǎn)品?沒錯,聊天社交、sns、直播之類的都很合適,因?yàn)檫@個模式就是能讓用戶與用戶之間解耦,不需要讓一個用戶去維護(hù)所有有關(guān)聯(lián)的用戶對象

  • 因?yàn)椴恍枰脩羧ゾS護(hù)關(guān)系,所以也就順便解決了關(guān)系之間的多對多維護(hù)的問題,同時,也不需要去修改用戶類來進(jìn)行關(guān)系的變更,保持了用戶類的良好封裝

  • 但是,中介者集中維護(hù)可能導(dǎo)致這個類過于復(fù)雜和龐大

  • 所以,模式不是萬能的,一定要弄清楚業(yè)務(wù)場景進(jìn)行取舍地使用

  • 中介者適用于一組對象以定義良好但是復(fù)雜的方式進(jìn)行通信的場合,以及想定制一個分布在多個類中的行為,而又不想生成太多子類的場合

作為一名企業(yè)家,深知項目管理的重要性,而項目經(jīng)理,在很多場合下就是一名中介者的角色。從組織角度看,一個項目的開始和結(jié)束,作為老板的我并不需要關(guān)心是由誰來具體編碼實(shí)現(xiàn),我要溝通的人只是項目經(jīng)理。同理,其他輔助部門包括財務(wù)、人事、行政等,他們也不關(guān)心誰來寫代碼,而只需要和項目經(jīng)理交流了解項目的情況以及需要配合的內(nèi)容。在項目團(tuán)隊中,寫代碼的人呢?也不需要知道誰來給他發(fā)工資或者考勤問題出在哪里,這一切也交給項目經(jīng)理解決就好了。所以說,項目經(jīng)理負(fù)責(zé)制的項目開發(fā),就是中介者模式的典型應(yīng)用。我們的手機(jī)廠之所以發(fā)展的如此之快,也多虧了這些項目經(jīng)理們,晚上請他們吃大餐去咯~~~

完整代碼:https://github.com/zhangyue0503/designpatterns-php/blob/master/15.mediator/source/mediator.php

實(shí)例

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

聊天室類圖

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 . '發(fā)送)', $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收到消息

說明

  • 有沒有發(fā)現(xiàn),中介者就是這個“聊天室”,由它來進(jìn)行信息的傳遞轉(zhuǎn)移

  • 這里由于不固定用戶人數(shù),因此是一個數(shù)組維護(hù)的,當(dāng)用戶發(fā)送消息的時候,除了他自己,其他人都收到了這條消息

  • 聊天室可以自由地進(jìn)出用戶,說實(shí)話,這個例子真的很像一個已經(jīng)差不多實(shí)現(xiàn)功能了的聊天應(yīng)用哦

  • 果然中介者模式真的很適合通信方面的應(yīng)用,但是,如果進(jìn)入的用戶非常多,$users列表就會越來越臃腫了哦,這就是上文中所述的中介者模式的問題所在

“PHP中的中介者模式是什么”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識可以關(guān)注億速云網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實(shí)用文章!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

php
AI