php中介者,PHP设计模式 - 中介者模式
【一】模式定義
中介者模式(Mediator)就是用一個中介對象來封裝一系列的對象交互,中介者使各對象不需要顯式地相互引用,從而使其耦合松散,而且可以獨立地改變它們之間的交互。
對于中介對象而言,所有相互交互的對象,都視為同事類,中介對象就是用來維護各個同事對象之間的關(guān)系,所有的同事類都只和中介對象交互,也就是說,中介對象是需要知道所有的同事對象的。當一個同事對象自身發(fā)生變化時,它是不知道會對其他同事對象產(chǎn)生什么影響,它只需要通知中介對象,“我發(fā)生變化了”,中介對象會去和其他同事對象進行交互的。這樣一來,同事對象之間的依賴就沒有了。有了中介者之后,所有的交互都封裝在了中介對象里面,各個對象只需要關(guān)心自己能做什么就行,不需要再關(guān)心做了之后會對其他對象產(chǎn)生什么影響,也就是無需再維護這些關(guān)系了。
【二】UML類圖
【三】示例代碼
MediatorInterface.php
namespace?DesignPatterns\Behavioral\Mediator;
/**
*?MediatorInterface是一個中介者契約
*?該接口不是強制的,但是使用它更加符合里氏替換原則
*/
interface?MediatorInterface
{
/**
*?發(fā)送響應
*
*?@param?string?$content
*/
public?function?sendResponse($content);
/**
*?發(fā)起請求
*/
public?function?makeRequest();
/**
*?查詢數(shù)據(jù)庫
*/
public?function?queryDb();
}
Mediator.php
namespace?DesignPatterns\Behavioral\Mediator;
use?DesignPatterns\Behavioral\Mediator\Subsystem;
/**
*?Mediator是中介者模式的具體實現(xiàn)類
*?In?this?example,?I?have?made?a?"Hello?World"?with?the?Mediator?Pattern.
*/
class?Mediator?implements?MediatorInterface
{
/**
*?@var?Subsystem\Server
*/
protected?$server;
/**
*?@var?Subsystem\Database
*/
protected?$database;
/**
*?@var?Subsystem\Client
*/
protected?$client;
/**
*?@param?Subsystem\Database?$db
*?@param?Subsystem\Client???$cl
*?@param?Subsystem\Server???$srv
*/
public?function?setColleague(Subsystem\Database?$db,?Subsystem\Client?$cl,?Subsystem\Server?$srv)
{
$this->database?=?$db;
$this->server?=?$srv;
$this->client?=?$cl;
}
/**
*?發(fā)起請求
*/
public?function?makeRequest()
{
$this->server->process();
}
/**
*?查詢數(shù)據(jù)庫
*?@return?mixed
*/
public?function?queryDb()
{
return?$this->database->getData();
}
/**
*?發(fā)送響應
*
*?@param?string?$content
*/
public?function?sendResponse($content)
{
$this->client->output($content);
}
}
Colleague.php
namespace?DesignPatterns\Behavioral\Mediator;
/**
*?Colleague是一個抽象的同事類,但是它只知道中介者Mediator,而不知道其他同事
*/
abstract?class?Colleague
{
/**
*?this?ensures?no?change?in?subclasses
*
*?@var?MediatorInterface
*/
private?$mediator;
/**
*?@param?MediatorInterface?$medium
*/
public?function?__construct(MediatorInterface?$medium)
{
$this->mediator?=?$medium;
}
//?for?subclasses
protected?function?getMediator()
{
return?$this->mediator;
}
}
Subsystem/Client.php
namespace?DesignPatterns\Behavioral\Mediator\Subsystem;
use?DesignPatterns\Behavioral\Mediator\Colleague;
/**
*?Client是發(fā)起請求&獲取響應的客戶端
*/
class?Client?extends?Colleague
{
/**
*?request
*/
public?function?request()
{
$this->getMediator()->makeRequest();
}
/**
*?output?content
*
*?@param?string?$content
*/
public?function?output($content)
{
echo?$content;
}
}
Subsystem/Database.php
namespace?DesignPatterns\Behavioral\Mediator\Subsystem;
use?DesignPatterns\Behavioral\Mediator\Colleague;
/**
*?Database提供數(shù)據(jù)庫服務
*/
class?Database?extends?Colleague
{
/**
*?@return?string
*/
public?function?getData()
{
return?"World";
}
}
Subsystem/Server.php
namespace?DesignPatterns\Behavioral\Mediator\Subsystem;
use?DesignPatterns\Behavioral\Mediator\Colleague;
/**
*?Server用于發(fā)送響應
*/
class?Server?extends?Colleague
{
/**
*?process?on?server
*/
public?function?process()
{
$data?=?$this->getMediator()->queryDb();
$this->getMediator()->sendResponse("Hello?$data");
}
}
【四】測試代碼
Tests/MediatorTest.php
namespace?DesignPatterns\Tests\Mediator\Tests;
use?DesignPatterns\Behavioral\Mediator\Mediator;
use?DesignPatterns\Behavioral\Mediator\Subsystem\Database;
use?DesignPatterns\Behavioral\Mediator\Subsystem\Client;
use?DesignPatterns\Behavioral\Mediator\Subsystem\Server;
/**
*?MediatorTest?tests?hello?world
*/
class?MediatorTest?extends?\PHPUnit_Framework_TestCase
{
protected?$client;
protected?function?setUp()
{
$media?=?new?Mediator();
$this->client?=?new?Client($media);
$media->setColleague(new?Database($media),?$this->client,?new?Server($media));
}
public?function?testOutputHelloWorld()
{
//?測試是否輸出?Hello?World?:
$this->expectOutputString('Hello?World');
//?正如你所看到的,?Client,?Server?和?Database?是完全解耦的
$this->client->request();
}
}
【五】總結(jié)
中介者主要是通過中介對象來封裝對象之間的關(guān)系,使之各個對象在不需要知道其他對象的具體信息情況下通過中介者對象來與之通信。同時通過引用中介者對象來減少系統(tǒng)對象之間關(guān)系,提高了對象的可復用和系統(tǒng)的可擴展性。但是就是因為中介者對象封裝了對象之間的關(guān)聯(lián)關(guān)系,導致中介者對象變得比較龐大,所承擔的責任也比較多。它需要知道每個對象和他們之間的交互細節(jié),如果它出問題,將會導致整個系統(tǒng)都會出問題。
總結(jié)
以上是生活随笔為你收集整理的php中介者,PHP设计模式 - 中介者模式的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 首次揭示:人类中耳由鱼鳃演变而来
- 下一篇: 董明珠谈格力做直播:体会市场 没达到预期