<?php
<?php
include "1.php";
/*
Návrhový vzor Composite spojuje více objektů do stromové struktury, v níž se navenek
tváří jako jeden objekt a lze je tak i použít.
---
Spojení objektů do stromové struktury znamená následující:
1. Vytvořit možnost poskládat více objektů typu Debugger do stromové struktury.
2. Objekt, který tuto stromovou strukturu obsahuje, se musí chovat jako jeden
z objektů typu Debugger.
*/
/*
Návrhový vzor Composite spojuje více objektů do stromové struktury, v níž se navenek
tváří jako jeden objekt a lze je tak i použít.
Pro dosažení tohoto cíle je nutné provést následující kroky:
1. V případě, že tak ještě nebylo učiněné, definovat rozhraní pro samotný
objekt stromu.
2. Vytvořit novou třídu, která implementuje toto rozhraní. Do této třídy přidat
další metodu (například addChild()), které se budou předávat libovolné
objekty implementující rozhraní z bodu 1. Tyto předané objekty následně
uložit jako pole v atributu třídy.
3. Implementovat všechny metody vyžadované rozhraním z bodu 1 takovým
způsobem, že se prochází přes všechny objekty přidané do třídy v bodě 2
a postupně je na ně delegováno volání příslušné metody.
4. Vytvořit libovolné objekty a pomocí metody addChild() je přiřadit do stromové
struktury.
5. V aplikaci použít tento strom objektů místo jednotlivých objektů.
*/
class DebuggerComposite implements Debugger
{
protected $debuggers = array();
public function addDebugger(Debugger $debugger)
{
$this->debuggers[] = $debugger;
}
public function removeDebugger(Debugger $debugger)
{
$key = array_search($debugger, $this->debuggers);
if (false === $key) {
return false;
}
unset($this->debuggers[$key]);
return true;
}
public function debug($message)
{
foreach ($this->debuggers as $debugger) {
$debugger->debug($message);
}
}
}
// Jednodussi pouziti
$debuggerEcho = DebuggerEcho::getInstance();
$debuggerLog = DebuggerLog::getInstance('./library.log');
$composite = new DebuggerComposite();
$composite->addDebugger($debuggerEcho);
$composite->addDebugger($debuggerLog);
$debuggerEcho->debug('Výpis na monitor');
$debuggerLog->debug('Zápis do souboru');
$composite->debug('Monitor + Soubor');
<?php
/* Slozitejsi
/*
Protože třída DebuggerComposite se navenek chová jako každý jiný objekt implementující
rozhraní Debugger, můžete ji použít i pro vytváření složitějších stromových
struktur
*/
$debuggerEcho = DebuggerEcho::getInstance();
$debuggerLog1 = DebuggerLog::getInstance('./debug1.log');
$debuggerLog2 = DebuggerLog::getInstance('./debug2.log');
$debuggerEmail1 = DebuggerEmail::getInstance('user1@example.com');
$debuggerEmail2 = DebuggerEmail::getInstance('user2@example.com');
$debuggerEmail3 = DebuggerEmail::getInstance('user3@example.com');
$compositeLog = new DebuggerComposite();
$compositeLog->addDebugger($debuggerLog1);
$compositeLog->addDebugger($debuggerLog2);
$compositeMail = new DebuggerComposite();
$compositeMail->addDebugger($debuggerMail1);
$compositeMail->addDebugger($debuggerMail2);
$compositeMail->addDebugger($debuggerMail3);
$composite = new DebuggerComposite();
$composite->addDebugger($compositeLog);
$composite->addDebugger($debuggerEcho);
$composite->addDebugger($compositeMail);