Skip to content

Instantly share code, notes, and snippets.

@Kcko
Created April 9, 2020 07:24
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save Kcko/f23556275e10bfcd1f764bfc678df63a to your computer and use it in GitHub Desktop.
Save Kcko/f23556275e10bfcd1f764bfc678df63a to your computer and use it in GitHub Desktop.
<?php
/*
Definice
---------
Návrhový vzor Mediator odstraňuje vzájemné vazby mezi komunikujícími objekty
a tím zajišťuje možnost vzájemné komunikace mezi objekty, které nejsou v přímé
interakci. Zavedením návrhového vzoru Mediator se mění vazby mezi objekty
z typu m:n na 1:n.
Pro implementaci tohoto návrhového vzoru jsou nezbytné následující kroky:
1. Definovat rozhraní prostředníka.
2. Definovat rozhraní objektů, které budou ke komunikaci využívat objekt
definovaný v bodě 1. Toto rozhraní musí obsahovat metodu, kterou bude
volat konkrétní prostředník.
3. Implementovat konkrétního prostředníka a v něm požadovanou logiku
zabezpečující komunikaci mezi objekty. V případě, že by byla požadovaná
logika velmi komplexní, definovat pomocné třídy prostředníka.
4. Implementovat konkrétního uživatele.
Návrhový vzor Mediator je konkurenčním návrhovým vzorem
k vzoru Observer, probíranému v předchozí kapitole, avšak oproti němu nedisponuje
možnostmi dynamického přidávání a odebírání objektů zajímajících se
o změny.
*/
interface Mediator
{
public function send($message, AbstractEmployee $employee);
}
abstract class AbstractEmployee
{
protected $id;
protected $mediator;
public function __construct($id, Mediator $mediator)
{
$this->setId($id);
$this->setMediator($mediator);
}
public function setId($id)
{
$this->id = $id;
}
public function getId()
{
return $this->id;
}
public function setMediator(Mediator $mediator)
{
$this->mediator = $mediator;
}
public function getMediator()
{
return $this->mediator;
}
public function send($message)
{
$this->mediator->send($message, $this);
}
abstract public function receive($message);
}
class NewsMediator implements Mediator
{
protected $employees = array();
public function registerEmployee(AbstractEmployee $employee)
{
$this->employees[] = $employee;
}
public function send($message, AbstractEmployee $sender)
{
foreach ($this->employees as $employee) {
if ($employee !== $sender) {
$employee->receive($message);
}
}
}
}
class Employee extends AbstractEmployee
{
public function receive($message)
{
printf("<%s> Přijatá zpráva: %s\n", $this->getId(), $message);
}
}
$mediator = new NewsMediator();
$employee1 = new Employee('EMP1', $mediator);
$employee2 = new Employee('EMP2', $mediator);
$employee3 = new Employee('EMP3', $mediator);
$employee4 = new Employee('EMP4', $mediator);
$mediator->registerEmployee($employee1);
$mediator->registerEmployee($employee2);
$mediator->registerEmployee($employee3);
$mediator->registerEmployee($employee4);
$employee3->send('Zpráva od EMP3');
$employee1->send('Odpověď od EMP1');
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment