Decorator

De la Wikipedia, enciclopedia liberă.
Salt la navigare Salt la căutare
Schema de clasă a modelului Decorator

În programarea orientată pe obiecte , decoratorul este unul dintre tiparele fundamentale, definite inițial de Gang of Four .

Decoratorul de modele de design vă permite să adăugați noi caracteristici obiectelor existente. Acest lucru se realizează prin construirea unei noi clase de decoratori care „înfășoară” obiectul original. Obiectul original este transmis constructorului decoratorului. De asemenea, este posibil să îi treceți un alt decorator. În acest fel, mai mulți decoratori pot fi înlănțuiți între ei, adăugând astfel funcționalitate clasa de beton (care este reprezentată de ultima verigă din lanț).

Concatenarea decoratorilor poate avea loc în conformitate cu o compoziție arbitrară: numărul de comportamente posibile ale obiectului compus variază deci în funcție de legea combinatorie în raport cu numărul de decoratori disponibili.

Acest model este o alternativă validă la utilizarea moștenirii unice sau multiple. Cu moștenirea, de fapt, adăugarea de funcționalități are loc în mod static în funcție de legăturile definite în ierarhia de clase și nu este posibil să se obțină o combinație arbitrară de funcționalități, nici adăugarea / eliminarea lor în timpul rulării .

Structura unui decorator

  • Componentă : definește interfața obiectului la care vor fi adăugate noi caracteristici.
  • ConcreteComponent : definește obiectul concret la care se adaugă caracteristici.
  • Decorator : menține o referință la obiectul Component și definește o interfață care este conformă cu interfața Component.
  • ConcreteDecorator : adaugă funcționalitate Componentei.

Operațiune

Decoratorul trimite solicitările Componentei care poate efectua operațiunile înainte și după trimiterea cererii.

În acest fel obțineți o flexibilitate mai mare, multe obiecte mici în loc de unul foarte complicat, schimbând conturul și nu substanța unei clase.

Exemplu

PHP

 clasa abstractă Componentă
{
    container $ protejat ;
    valoare $ protejată ;
    funcție publică abstractă getContainer ();
    funcție publică abstractă getValue ();
}

clasa ComponenteConcreto extinde Componenta
{
    funcție publică __construct ()
    {
        $ this -> value = 1000 ;
        $ this -> container = "Component beton: \ t { $ this -> value } \ n " ;
    }

    funcție publică getContainer ()
    {
        returnează $ this -> container ;
    }

    funcție publică getValue ()
    {
        returnează $ this -> value ;
    }
}

clasa abstractă Decorator extinde Componenta
{
    
}

clasa DecoratoreConcreto1 extinde Decoratore
{
    funcție publică __construct ( Component $ container )
    {
        $ this -> value = 1000 ;
        $ this -> container = $ container ;
    }

    funcție publică getContainer ()
    {
        returnează $ this -> container -> getContainer () . "Decorator de beton 1: \ t { $ this -> value } \ n " ;
    }

    funcție publică getValue ()
    {
        returnează $ this -> valoare + $ this -> container -> getValue ();
    }
}

clasa DecoratoreConcreto2 extinde Decoratore
{
    funcție publică __construct ( Component $ container )
    {
        $ this -> value = 1000 ;
        $ this -> container = $ container ;
    }

    funcție publică getContainer ()
    {
        returnează $ this -> container -> getContainer () . "Concrete Decorator 2: \ t { $ this -> value } \ n " ;
    }

    funcție publică getValue ()
    {
        returnează $ this -> valoare + $ this -> container -> getValue ();
    }
}

clasa Client
{
    componentă $ privată ;

    funcție publică __construct ()
    {
        $ this -> component = new ComponenteConcreto ();
        $ this -> component = $ this -> wrapComponent ( $ this -> component );

        echo $ this -> component -> getContainer ();
        ecou „Client: \ t \ t  ;
        echo $ this -> component -> getValue ();
    }

    funcție privată wrapComponent ( Component $ component )
    {
        $ component1 = new DecoratoreConcreto1 ($ component);
        $ component2 = nou DecoratoreConcreto2 ($ component1);
        returnează $ component2 ;
    }
}

ecou " \ n \ n " ;
$ Client = nou client ();

// Rezultat: # quanton81

// Component beton: 1000
// Decorator de beton 1: 1000
// Decorator de beton 2: 1000
// Client: 3000

Elemente conexe

Alte proiecte