reworked the Mediator pattern

This commit is contained in:
Dominik Liebler
2019-08-22 16:00:47 +02:00
parent 0d24d48c26
commit 6d2f308401
11 changed files with 70 additions and 120 deletions

View File

@@ -1,47 +0,0 @@
<?php declare(strict_types=1);
namespace DesignPatterns\Behavioral\Mediator;
class ConcreteMediator implements Mediator
{
/**
* @var Subsystem\Server
*/
private $server;
/**
* @var Subsystem\Database
*/
private $database;
/**
* @var Subsystem\Client
*/
private $client;
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();
}
public function sendResponse(string $content)
{
$this->client->output($content);
}
}

View File

@@ -4,9 +4,5 @@ namespace DesignPatterns\Behavioral\Mediator;
interface Mediator
{
public function sendResponse(string $content);
public function makeRequest();
public function queryDb();
public function getUser(string $username): string;
}

View File

@@ -30,33 +30,27 @@ Mediator.php
:language: php
:linenos:
ConcreteMediator.php
.. literalinclude:: ConcreteMediator.php
:language: php
:linenos:
Colleague.php
.. literalinclude:: Colleague.php
:language: php
:linenos:
Subsystem/Client.php
Ui.php
.. literalinclude:: Subsystem/Client.php
.. literalinclude:: Ui.php
:language: php
:linenos:
Subsystem/Database.php
UserRepository.php
.. literalinclude:: Subsystem/Database.php
.. literalinclude:: UserRepository.php
:language: php
:linenos:
Subsystem/Server.php
UserRepositoryUiMediator.php
.. literalinclude:: Subsystem/Server.php
.. literalinclude:: UserRepositoryUiMediator.php
:language: php
:linenos:

View File

@@ -1,21 +0,0 @@
<?php declare(strict_types=1);
namespace DesignPatterns\Behavioral\Mediator\Subsystem;
use DesignPatterns\Behavioral\Mediator\Colleague;
/**
* Client is a client that makes requests and gets the response.
*/
class Client extends Colleague
{
public function request()
{
$this->mediator->makeRequest();
}
public function output(string $content)
{
echo $content;
}
}

View File

@@ -1,13 +0,0 @@
<?php declare(strict_types=1);
namespace DesignPatterns\Behavioral\Mediator\Subsystem;
use DesignPatterns\Behavioral\Mediator\Colleague;
class Database extends Colleague
{
public function getData(): string
{
return 'World';
}
}

View File

@@ -1,14 +0,0 @@
<?php declare(strict_types=1);
namespace DesignPatterns\Behavioral\Mediator\Subsystem;
use DesignPatterns\Behavioral\Mediator\Colleague;
class Server extends Colleague
{
public function process()
{
$data = $this->mediator->queryDb();
$this->mediator->sendResponse(sprintf("Hello %s", $data));
}
}

View File

@@ -2,20 +2,18 @@
namespace DesignPatterns\Tests\Mediator\Tests;
use DesignPatterns\Behavioral\Mediator\ConcreteMediator;
use DesignPatterns\Behavioral\Mediator\Subsystem\Client;
use DesignPatterns\Behavioral\Mediator\Subsystem\Database;
use DesignPatterns\Behavioral\Mediator\Subsystem\Server;
use DesignPatterns\Behavioral\Mediator\Ui;
use DesignPatterns\Behavioral\Mediator\UserRepository;
use DesignPatterns\Behavioral\Mediator\UserRepositoryUiMediator;
use PHPUnit\Framework\TestCase;
class MediatorTest extends TestCase
{
public function testOutputHelloWorld()
{
$client = new Client();
new ConcreteMediator(new Database(), $client, new Server());
$mediator = new UserRepositoryUiMediator(new UserRepository(), new UI());
$this->expectOutputString('Hello World');
$client->request();
$this->expectOutputString('User: Dominik');
$mediator->printInfoAbout('Dominik');
}
}

View File

@@ -0,0 +1,11 @@
<?php declare(strict_types=1);
namespace DesignPatterns\Behavioral\Mediator;
class Ui extends Colleague
{
public function outputUserInfo(string $username)
{
echo $this->mediator->getUser($username);
}
}

View File

@@ -0,0 +1,11 @@
<?php declare(strict_types=1);
namespace DesignPatterns\Behavioral\Mediator;
class UserRepository extends Colleague
{
public function getUserName(string $user): string
{
return 'User: ' . $user;
}
}

View File

@@ -0,0 +1,35 @@
<?php declare(strict_types=1);
namespace DesignPatterns\Behavioral\Mediator;
class UserRepositoryUiMediator implements Mediator
{
/**
* @var UserRepository
*/
private $userRepository;
/**
* @var Ui
*/
private $ui;
public function __construct(UserRepository $userRepository, Ui $ui)
{
$this->userRepository = $userRepository;
$this->ui = $ui;
$this->userRepository->setMediator($this);
$this->ui->setMediator($this);
}
public function printInfoAbout(string $user)
{
$this->ui->outputUserInfo($user);
}
public function getUser(string $username): string
{
return $this->userRepository->getUserName($username);
}
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 72 KiB

After

Width:  |  Height:  |  Size: 55 KiB