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.