ホームページ  >  記事  >  バックエンド開発  >  PHPデザインパターンシリーズ - Mediatorパターン(Mediator)

PHPデザインパターンシリーズ - Mediatorパターン(Mediator)

WBOY
WBOYオリジナル
2016-06-20 12:41:421020ブラウズ

1. パターン定義

Mediator パターンは、一連のオブジェクトの対話をカプセル化するためにオブジェクトを使用するため、オブジェクトが相互に明示的に参照する必要がなくなります。それらは疎結合されており、相互作用を独立して変更できるようになります。

中間オブジェクトの場合、相互に対話するすべてのオブジェクトは、各同僚オブジェクト間の関係を維持するために使用されます。たとえば、中間オブジェクトはすべての同僚オブジェクトを知っている必要があります。同僚オブジェクト自体が変更されると、それが他の同僚オブジェクトにどのような影響を与えるかはわかりません。「変更しました」と中間オブジェクトに通知するだけでよく、中間オブジェクトは他の同僚オブジェクトと対話します。このようにして、同僚オブジェクト間の依存関係がなくなりました。メディエーターを使用すると、すべてのインタラクションが仲介オブジェクトにカプセル化されます。各オブジェクトは、自分が実行できることだけを考慮する必要があり、他のオブジェクトに与える影響を考慮する必要がなくなりました。これらの関係。

2. UML クラス図

3. サンプルコード

MediatorInterface.php

<?phpnamespace DesignPatterns\Behavioral\Mediator;/** * MediatorInterface是一个中介者契约 * 该接口不是强制的,但是使用它更加符合里氏替换原则 */interface MediatorInterface{    /**     * 发送响应     *     * @param string $content     */    public function sendResponse($content);    /**     * 发起请求     */    public function makeRequest();    /**     * 查询数据库     */    public function queryDb();}

Mediator.php

<?phpnamespace DesignPatterns\Behavioral\Mediator;use DesignPatterns\Behavioral\Mediator\Subsystem;/** * Mediator是中介者模式的具体实现类 * 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;    }    /**     * 发起请求     */    public function makeRequest()    {        $this->server->process();    }    /**     * 查询数据库     * @return mixed     */    public function queryDb()    {        return $this->database->getData();    }    /**     * 发送响应     *     * @param string $content     */    public function sendResponse($content)    {        $this->client->output($content);    }}

Colleague.php

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

サブシステム/Client.php

<?phpnamespace DesignPatterns\Behavioral\Mediator\Subsystem;use DesignPatterns\Behavioral\Mediator\Colleague;/** * Client是发起请求&获取响应的客户端 */class Client extends Colleague{    /**     * request     */    public function request()    {        $this->getMediator()->makeRequest();    }    /**     * output content     *     * @param string $content     */    public function output($content)    {        echo $content;    }}

サブシステム/Database.php

<?phpnamespace DesignPatterns\Behavioral\Mediator\Subsystem;use DesignPatterns\Behavioral\Mediator\Colleague;/** * Database提供数据库服务 */class Database extends Colleague{    /**     * @return string     */    public function getData()    {        return "World";    }}

サブシステム/サーバー.php

<?phpnamespace DesignPatterns\Behavioral\Mediator\Subsystem;use DesignPatterns\Behavioral\Mediator\Colleague;/** * Server用于发送响应 */class Server extends Colleague{    /**     * process on server     */    public function process()    {        $data = $this->getMediator()->queryDb();        $this->getMediator()->sendResponse("Hello $data");    }}

4. テストコード

Tests/MediatorTest.php

<?phpnamespace 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();    }}

5. 概要

メディエーターは主に仲介者を使用します オブジェクトはカプセル化しますオブジェクト間の関係。これにより、各オブジェクトは、他のオブジェクトの特定の情報を知らなくても、メディエーター オブジェクトを通じて他のオブジェクトと通信できます。同時に、メディエーター オブジェクトを参照することでシステム オブジェクト間の関係が軽減され、オブジェクトの再利用性とシステムのスケーラビリティが向上します。ただし、メディエーター オブジェクトはオブジェクト間の関係をカプセル化するため、メディエーター オブジェクトは大きくなり、より多くの責任を負うことになります。各オブジェクトの詳細とオブジェクト間の相互作用を把握する必要があり、それがうまくいかないと、システム全体がおかしくなってしまいます。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。