/ Gists / 7. Composite
On gists

7. Composite

Navrhove vzory - Bohmer

composite.php Raw #

<?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');

pic.md Raw #

composite-nested.php Raw #

<?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);