• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Wzorzec - dekorator, czym różni się od dziedziczenia?

Aruba Cloud VPS - 50% taniej przez 3 miesiące!
0 głosów
682 wizyt
pytanie zadane 17 lutego 2018 w JavaScript przez SandraS Obywatel (1,400 p.)
Czy wzorzec dekoratora różni się od dziedziczenia? Tworzymy jakiś interface i go implementujemy za pomocą extends w wybranej klasie i mamy dostęp do jej metod, ale tak samo jest przy dziedziczeniu. Jak to rozróżnić? W internecie nie potrafię znaleźć prostego przykładu pokazującego typowe przeznaczenie tego wzorca dekoratora.
Help :(

1 odpowiedź

0 głosów
odpowiedź 17 lutego 2018 przez mbabane Szeryf (79,260 p.)
wybrane 17 lutego 2018 przez SandraS
 
Najlepsza

Chodzi o to że wzorzec dekorator pozwala na dowolne (w obrębie oczywiście jednego kontekstu) rozszerzenie funkcjonalności bez głębokiej modyfikacji danej klasy. Popatrz na to:

http://arnonedev.pl/wp-content/uploads/2017/04/decorator_car_dealer_new_version.png

To dziedziczenie (czy implementacja interfejsu Car) przez klasę CarDecorator jest po to aby zapewnić zgodność typów.

Analizując powyższy przykład, można bardzo łatwo stworzyć dowolną kombinację funkcjonalności danego modelu samochodu. Dodając kolejne funkcjonalności dla Mustang powstaje takie opakowanko:

http://arnonedev.pl/wp-content/uploads/2017/04/decorator_contract_diagram.png

Najpierw Mustang rozszerzany jest  (jest dekorowany) za pomocą Seats, a potem za pomocą Wheels.

Jeśli do tego celu chciałbyś wykorzystać dziedziczenie (samo), to prawdopodobnie trzeba by dużego monitora żeby zobaczyć powyższy przykład (jako diagram UML) i dużo bardziej skomplikowanego kodu, którego będzie strach dotknąć aby nie zepsuć czegoś.

Mając wzorzec dekorator dodajemy kolejny... dekorator, a więc kolejną podklasę (odnosząc się do przykładu) klasy CarDecorator. Dzięki temu zyskujemy coś bardzo cennego, wprowadzając nową funkcjonalność do klasy. nie naruszamy tej klasy.

komentarz 17 lutego 2018 przez SandraS Obywatel (1,400 p.)
Ale jak tworzymy nową klasę, która dziedziczy po bazowej to w ten sam sposób nie poszerzamy jej funkcjonalności o np. nowe metody, nie naruszając jej tak  samo jak dekoratory?
komentarz 17 lutego 2018 przez SandraS Obywatel (1,400 p.)
Na tym wzorze dodawanie np. tego wyposażenia dokonuje się na głównej klasie. Tak samo marki samochodów wychodzą z tej klasy. Rozumiem, że w głównej klasie Car extendujemy CarDecorator i osobno modele samochodów przez co wynikowo powstaje samochód z wyposażeniem? Wybacz - jestem początkującą programistką i robię prezentację na ten temat i chciałabym to skumać ;/
komentarz 17 lutego 2018 przez mbabane Szeryf (79,260 p.)
Tylko wtedy masz to wszystko na sztywno wpięte w kod. A stosując dekorator możesz tworzyć bardzo szybko i bez irytacji dowolne kombinacje.

Wyobraź sobie teraz taką sytuacje. Przychodzi do Ciebie klient poproszę Mustanga, który ma system Audio oraz GPS. Przychodzi drugi klient poproszę Mustanga bez GPS, ale z Audio?

Jak to w kodzie zapisać?
komentarz 17 lutego 2018 przez SandraS Obywatel (1,400 p.)

class Mustang extends Audio { ... } ale także musi zawierać główną klasę Car tak? Gubię się w tym, co zawiera co. Spójrz na to :Dekorator w tym przypadku jest rozszerzany przez samochód, ale marki samochodów również, natomiast wyposażenie jest rozszerzane przez dekoratora.
Chyba, że ja tutaj nie rozumiem podstaw. TO extends powoduje rozszerzenie funkcjonalności w którym kierunku? Np. class Mercedes extends Samochód rozszerza funkcjonalność Samochodu, czy Mercedes ma implementowane funkcjonalności Samochodu?

komentarz 17 lutego 2018 przez mbabane Szeryf (79,260 p.)

Z rozszerzeniem Samochod przez Dekorator, chodzi o to aby zapewnić, że ten dekorator na pewno dotyczy samochodu.

class Mercedes extends Samochód rozszerza funkcjonalność Samochodu

Dokładnie, aczkolwiek w tym konkretnym przypadku nie do końca może chodzić o rozszerzenie funkcjonalności Samochod, a o zbudowanie pewnej hierarchii (że Fiat jest samochodem, że Mercedes jest też samochodem, ale trochę innym niż Fiat wiec jest osobna klasa).

czy Mercedes ma implementowane funkcjonalności Samochodu?

Tak jest.

Kod zdaje się jest w porządku.

Tak na marginesie, kod wklejaj używając komponentu ukrytego pod ikonką {...}. Jak pewnie widzisz screen jest słabo czytelny.

komentarz 17 lutego 2018 przez SandraS Obywatel (1,400 p.)
Dobrze, będę inaczej pokazywać kod.
Ale mam jeszcze jedno pytanie.
Skoro Mercedes rozszerza Samochód i Dekorator rozszerza Samochód, to Mercedes zna się z Dekoratorem? Przez to, że Samochód jest rozszerzony o Dekorator, który posiada jakieś tam wyposażenie - to powoduje, że jak Mercedes dołączymy do Samochodu to będzie miał on dostęp do tego funkcjonalności Dekoratora?
komentarz 17 lutego 2018 przez mbabane Szeryf (79,260 p.)
Nie, takie zjawisko nie zachodzi w dziedziczeniu.

Podobne pytania

0 głosów
1 odpowiedź 614 wizyt
pytanie zadane 25 stycznia 2022 w JavaScript przez Grzegorz Mikina Dyskutant (8,060 p.)
+1 głos
1 odpowiedź 343 wizyt
+1 głos
6 odpowiedzi 13,451 wizyt
pytanie zadane 18 kwietnia 2015 w Java przez SamSam Obywatel (1,120 p.)

93,096 zapytań

142,059 odpowiedzi

321,513 komentarzy

62,441 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

Wprowadzenie do ITsec, tom 1 Wprowadzenie do ITsec, tom 2

Można już zamawiać dwa tomy książek o ITsec pt. "Wprowadzenie do bezpieczeństwa IT" - mamy dla Was kod: pasja (użyjcie go w koszyku), dzięki któremu uzyskamy aż 15% zniżki! Dziękujemy ekipie Sekuraka za fajny rabat dla naszej Społeczności!

...