Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: wzorzec dekorator
Forum PHP.pl > Forum > PHP > Pro > Archiwum Pro
aleksander
Witam,

chciałem się Was zapytać, czy moje rozumienie dekoratorów jest poprawne. Czytałem o nich na java.com onjava.com i w książce thinking in patterns (http://www.bruceeckel.com/) i na podstawie TIP zrobiłem taki, działający w php zestaw klas
  1. <?php
  2. class Dekorator
  3. {
  4. protected $komponent;
  5.  
  6. public function __construct( $komponent = false )
  7. {
  8. $this->komponent = $komponent;
  9. }
  10. public function wezOpis()
  11. {
  12. if( $this->komponent != false )
  13. {
  14. return $this->komponent->wezOpis() . $this->opis;
  15. } else {
  16. return $this->opis;
  17. }
  18. }
  19.  
  20. public function wezCene()
  21. {
  22. if( $this->komponent != false )
  23. {
  24. return $this->komponent->wezCene() + $this->cena;
  25. } else {
  26. return $this->cena;
  27. }
  28. }
  29. }
  30.  
  31. class KawaEkspresowa extends Dekorator
  32. {
  33. protected $opis = 'To jest kawa ekspresowa.';
  34.  
  35. protected $cena = 5;
  36. }
  37.  
  38. class Mleko extends Dekorator
  39. {
  40. protected $opis = 'To jest mleko do kawy.';
  41.  
  42. protected $cena = 2; 
  43. }
  44.  
  45. class Cukier extends Dekorator
  46. {
  47. protected $opis = 'To jest cukier.';
  48.  
  49. protected $cena = 1;
  50. }
  51.  
  52. $a = new KawaEkspresowa( new Mleko( new Cukier() ) );
  53. echo $a->wezOpis();
  54. echo $a->wezCene();
  55. ?>
Kod
To jest cukier.To jest mleko do kawy.To jest kawa ekspresowa.
8
No i teraz pytanie zasadnicze: czy to jest właśnie dekorator?
Dla używających dekoratorów - gdzie je stosowaliście?
wolan
witaj,

przyjrzyj sie mojavi3. od jakiegos czasu dekoratory sa dostepne w tym frameworku. na wiki nawet jest przyklad global templating z ich uzyciem: http://wiki.mojavi.org/159.html. moze Ci sie rozjasni.

z wyrazami szacunku,
wolan
hawk
@aleksander: Twój przykład dekoratora jest jednak kiepski. Dekorator powinien dziedziczyć z klasy bazowej (to masz, tylko klasę bazową nazywasz Dekorator) i powinien ją "dekorować" dodając funkcjonalność. Problem w tym, że twoje klasy pochodne nie dodają w zasadzie funkcjonalności, tylko bazują na czymś, co zostało już zrobione w klasie bazowej (np. wyliczanie ceny), dostarczając tylko nowe dane. To nie to samo.

Co do przykładów dekoratorów, nie polecałbym frameworków, ponieważ zawsze będzie to przykład specyficzny, charakterystyczny właśnie dla frameworka. A nam chodzi o sam, "czysty" wzorzec. Więc polecam:
- książkę GoF, ew. jakieś internetowe źródło na podstawie tej książki
- jakiś prosty przykład z bibliotek standardowych Javy, które są naszpikowane wzorcami - np. buforowane strumienie I/O
- wzorzec Intercepting Filter

Gdzie stosowałem dekoratory? W wielu przypadkach. Tam gdzie były potrzebne winksmiley.jpg. Nie da się tego opisać w paru słowach, bo nie można rozpatrywać konkretnego zastosowania w oderwaniu od aplikacji.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.