Created
April 9, 2020 07:24
-
-
Save Kcko/f23556275e10bfcd1f764bfc678df63a to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?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