目的
本模式提供了一種輕松的多組件之間弱耦合的協同方式,如果你有個 “情報中心”,觀察者模式也是個好選擇,類似于控制器(并非 MVC 意義上的控制器),
所有關聯協同的組件(稱作 Colleague)僅與 MediatorInterface 介面建立耦合,面向物件編程中這是好事,一個良友勝于有多個朋友,這是該模式的重要特性,
UML圖
★官方PHP高級學習交流社群「點擊」管理整理了一些資料,BAT等一線大廠進階知識體系備好(相關學習資料以及筆面試題)以及不限于:分布式架構、高可擴展、高性能、高并發、服務器性能調優、TP6,laravel,YII2,Redis,Swoole、Swoft、Kafka、Mysql優化、shell腳本、Docker、微服務、Nginx等多個知識點高級進階干貨
代碼
MediatorInterface.php
<?php
namespace DesignPatterns\Behavioral\Mediator;
/**
* MediatorInterface 介面為 Mediator 類建立契約
* 該介面雖非強制,但優于 Liskov 替換原則,
*/
interface MediatorInterface
{
/**
* 發出回應
*
* @param string $content
*/
public function sendResponse($content);
/**
* 做出請求
*/
public function makeRequest();
/**
* 查詢資料庫
*/
public function queryDb();
}
Mediator.php
<?php
namespace DesignPatterns\Behavioral\Mediator;
/**
* Mediator 是用于訪設計模式的中介者模式的物體
*
* 本示例中,我用中介者模式做了一個 “Hello World” 的回應
*/
class Mediator implements MediatorInterface
{
/**
* @var Subsystem\Server
*/
private $server;
/**
* @var Subsystem\Database
*/
private $database;
/**
* @var Subsystem\Client
*/
private $client;
/**
* @param Subsystem\Database $database
* @param Subsystem\Client $client
* @param Subsystem\Server $server
*/
public function __construct(Subsystem\Database $database, Subsystem\Client $client, Subsystem\Server $server)
{
$this->database = $database;
$this->server = $server;
$this->client = $client;
$this->database->setMediator($this);
$this->server->setMediator($this);
$this->client->setMediator($this);
}
public function makeRequest()
{
$this->server->process();
}
public function queryDb(): string
{
return $this->database->getData();
}
/**
* @param string $content
*/
public function sendResponse($content)
{
$this->client->output($content);
}
}
Colleague.php
<?php
namespace DesignPatterns\Behavioral\Mediator;
/**
* Colleague 是個抽象類,該類物件雖彼此協同卻不知彼此,只知中介者 Mediator 類
*/
abstract class Colleague
{
/**
* 確保子類不變化,
*
* @var MediatorInterface
*/
protected $mediator;
/**
* @param MediatorInterface $mediator
*/
public function setMediator(MediatorInterface $mediator)
{
$this->mediator = $mediator;
}
}
Subsystem/Client.php
<?php
namespace DesignPatterns\Behavioral\Mediator\Subsystem;
use DesignPatterns\Behavioral\Mediator\Colleague;
/**
* Client 類是一個發出請求并獲得回應的客戶端,
*/
class Client extends Colleague
{
public function request()
{
$this->mediator->makeRequest();
}
public function output(string $content)
{
echo $content;
}
}
Subsystem/Database.php
<?php
namespace DesignPatterns\Behavioral\Mediator\Subsystem;
use DesignPatterns\Behavioral\Mediator\Colleague;
class Database extends Colleague
{
public function getData(): string
{
return 'World';
}
}
Subsystem/Server.php
<?php
namespace DesignPatterns\Behavioral\Mediator\Subsystem;
use DesignPatterns\Behavioral\Mediator\Colleague;
class Server extends Colleague
{
public function process()
{
$data = https://www.cnblogs.com/phpyu/p/$this->mediator->queryDb();
$this->mediator->sendResponse(sprintf("Hello %s", $data));
}
}
測驗
Tests/MediatorTest.php
<?php
namespace DesignPatterns\Tests\Mediator\Tests;
use DesignPatterns\Behavioral\Mediator\Mediator;
use DesignPatterns\Behavioral\Mediator\Subsystem\Client;
use DesignPatterns\Behavioral\Mediator\Subsystem\Database;
use DesignPatterns\Behavioral\Mediator\Subsystem\Server;
use PHPUnit\Framework\TestCase;
class MediatorTest extends TestCase
{
public function testOutputHelloWorld()
{
$client = new Client();
new Mediator(new Database(), $client, new Server());
$this->expectOutputString('Hello World');
$client->request();
}
}
PHP 互聯網架構師成長之路*「設計模式」終極指南
PHP 互聯網架構師 50K 成長指南+行業問題解決總綱(持續更新)
面試10家公司,識訓9個offer,2020年PHP 面試問題
★如果喜歡我的文章,想與更多資深開發者一起交流學習的話,獲取更多大廠面試相關技術咨詢和指導,歡迎加入我們的群啊,暗號:phpzh(君羊號碼856460874),
2020年最新PHP進階教程,全系列!
> 內容不錯的話希望大家支持鼓勵下點個贊/喜歡,歡迎一起來交流;另外如果有什么問題 建議 想看的內容可以在評論提出
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/74608.html
標籤:PHP
上一篇:求助,校園二手交易網站畢業程式要求添加匿名評論
下一篇:請問一下關于資料統計傳值的方法