中介者模式(Mediator Pattern): 用一個中介對象來封裝一系列的對象交互,中介者使各對象不需要顯式地相互引用,從而使其耦合松散,而且可以獨立地改變它們之間的交互。中介者模式又稱為調(diào)停者模式,它是一種對象行為型模式叫榕。
(一)為什么需要中介者模式
1浑侥,中介者模式可以使對象之間的關(guān)系數(shù)量急劇減少。
2晰绎,中轉(zhuǎn)作用(結(jié)構(gòu)性):通過中介者提供的中轉(zhuǎn)作用寓落,各個同事對象就不再需要顯式引用其他同事,當(dāng)需要和其他同事進(jìn)行通信時荞下,通過中介者即可伶选。該中轉(zhuǎn)作用屬于中介者在結(jié)構(gòu)上的支持。
3尖昏,協(xié)調(diào)作用(行為性):中介者可以更進(jìn)一步的對同事之間的關(guān)系進(jìn)行封裝仰税,同事可以一致地和中介者進(jìn)行交互,而不需要指明中介者需要具體怎么做抽诉,中介者根據(jù)封裝在自身內(nèi)部的協(xié)調(diào)邏輯陨簇,對同事的請求進(jìn)行進(jìn)一步處理,將同事成員之間的關(guān)系行為進(jìn)行分離和封裝迹淌。該協(xié)調(diào)作用屬于中介者在行為上的支持河绽。
(二)中介者模式 UML圖
(三)簡單實例
中介者模式的思想在現(xiàn)實生活中也很常見,比如說交換機唉窃。沒有交換機存在的時代耙饰,每個電話之間都需要電話線連接才能進(jìn)行通話。如果一個臺電話要和其它100臺電話通話纹份,那么它就必須要有100條電話線與其它100個電話連接苟跪。
后來為了解決這種麻煩,交換機出現(xiàn)了矮嫉。每個電話只需連入交換機削咆,通話時。只需構(gòu)建一條電話-交換機-電話的鏈路蠢笋,就可以進(jìn)行通話。所以現(xiàn)在我們的電話理論上可以同世界上任何一臺電話通話鳞陨,但是只需一條電話線昨寞。當(dāng)然現(xiàn)在用電話的人少了,但是手機呀厦滤,計算機網(wǎng)絡(luò)的實現(xiàn)也是在傳統(tǒng)通信網(wǎng)的設(shè)計上進(jìn)行演進(jìn)的援岩。
其實交換機對應(yīng)的就是中介者模式的中介者,而電話機就是中介者中的同事掏导。下面享怀,就讓我們用代碼來實現(xiàn)這個思想。
<?php
//抽象同事類 --------電話機
abstract class Colleague{
protected $mediator; //用于存放中介者
abstract public function sendMsg($num,$msg);
abstract public function receiveMsg($msg);
//設(shè)置中介者
final public function setMediator(Mediator $mediator){
$this->mediator = $mediator;
}
}
//具體同事類 ---------座機
class Phone extends Colleague
{
public function sendMsg($num,$msg)
{
echo __class__.'--發(fā)送聲音:'.$msg.PHP_EOL;
$this->mediator->opreation($num,$msg);
}
public function receiveMsg($msg)
{
echo __class__.'--接收聲音:'.$msg.PHP_EOL;
}
}
//具體同事類----------手機
class Telephone extends Colleague
{
public function sendMsg($num,$msg)
{
echo __class__.'--發(fā)送聲音:'.$msg.PHP_EOL;
$this->mediator->opreation($num,$msg);
}
//手機接收信息前 會智能響鈴
public function receiveMsg($msg)
{
echo '響鈴-------'.PHP_EOL;
echo __class__.'--接收聲音:'.$msg.PHP_EOL;
}
}
//抽象中介者類
abstract class Mediator{
abstract public function opreation($id,$message);
abstract public function register($id,Colleague $colleague);
}
//具體中介者類------交換機
class switches extends Mediator
{
protected $colleagues = array();
//交換機業(yè)務(wù)處理
public function opreation($num,$message)
{
if (!array_key_exists($num,$this->colleagues)) {
echo __class__.'--交換機內(nèi)沒有此號碼信息趟咆,無法通話'.PHP_EOL;
}else{
$this->colleagues[$num]->receiveMsg($message);
}
}
//注冊號碼
public function register($num,Colleague $colleague)
{
if (!in_array($colleague, $this->colleagues)) {
$this->colleagues[$num] = $colleague;
}
$colleague->setMediator($this);
}
}
//實例化固話
$phone = new Phone;
//實例化手機
$telephone = new Telephone;
//實例化交換機
$switches = new Switches;
//注冊號碼 ---放號
$switches->register(6686668,$phone);
$switches->register(18813290000,$telephone);
//通話
$phone->sendMsg(18813290000,'hello world');
$telephone->sendMsg(6686668,'請說普通話');
$telephone->sendMsg(6686660,'你好');