Czytałem artykuł programistyczny, w którym wspomniałem o wzorze dekoratora. Przez jakiś czas programowałem, ale nie miałem formalnego wykształcenia ani szkolenia, ale staram się poznać standardowe wzorce i tym podobne.
Poszukałem Dekoratora i znalazłem na nim artykuł w Wikipedii . Teraz rozumiem koncepcję wzoru Dekoratora, ale ten fragment był mnie trochę zdezorientowany:
Jako przykład rozważmy okno w systemie okienkowym. Aby umożliwić przewijanie zawartości okna, możemy dodać do niego odpowiednio poziome lub pionowe paski przewijania. Załóżmy, że okna są reprezentowane przez instancje klasy Window, i załóżmy, że ta klasa nie ma funkcji dodawania pasków przewijania. Możemy stworzyć podklasę ScrollingWindow, która je udostępnia, lub możemy stworzyć ScrollingWindowDecorator, który doda tę funkcjonalność do istniejących obiektów Windows. W tym momencie każde rozwiązanie byłoby w porządku.
Załóżmy teraz, że chcemy również możliwości dodawania ramek do naszych okien. Ponownie, nasza oryginalna klasa Window nie ma wsparcia. Podklasa ScrollingWindow stanowi teraz problem, ponieważ skutecznie stworzyła nowy rodzaj okna. Jeśli chcemy dodać obsługę granic do wszystkich okien, musimy utworzyć podklasy WindowWithBorder i ScrollingWindowWithBorder. Oczywiście problem ten nasila się z każdą dodaną nową funkcją. W przypadku rozwiązania dekoratora po prostu tworzymy nowy BorderedWindowDecorator - w czasie wykonywania możemy dekorować istniejące okna za pomocą ScrollingWindowDecorator lub BorderedWindowDecorator lub obu, w zależności od potrzeb.
OK, kiedy mówią, aby dodać obramowanie do wszystkich okien, dlaczego po prostu nie dodać funkcji do oryginalnej klasy Window, aby umożliwić tę opcję? Moim zdaniem podklasowanie służy jedynie do dodawania określonych funkcji do klasy lub zastępowania metody klasowej. Gdybym musiał dodać funkcjonalność do wszystkich istniejących obiektów, dlaczego po prostu nie zmodyfikowałbym nadklasy, aby to zrobić?
W artykule była inna linia:
Wzór dekoratora jest alternatywą dla podklas. Podklasowanie dodaje zachowanie podczas kompilacji, a zmiana wpływa na wszystkie instancje oryginalnej klasy; dekorowanie może zapewnić nowe zachowanie w czasie wykonywania dla poszczególnych obiektów.
Nie rozumiem, co mówią „... zmiana wpływa na wszystkie wystąpienia oryginalnej klasy” - jak podklasa zmienia klasę nadrzędną? Czy nie o to chodzi w podklasie?
Zakładam, że artykuł, podobnie jak wiele Wiki, po prostu nie jest napisany jasno. Widzę użyteczność Dekoratora w ostatnim wierszu - „... zapewniają nowe zachowanie w czasie wykonywania dla poszczególnych obiektów”.
Bez zapoznania się z tym wzorcem, gdybym musiał zmienić zachowanie w czasie wykonywania dla poszczególnych obiektów, prawdopodobnie wbudowałbym pewne metody w nadklasę lub podklasę, aby włączyć / wyłączyć to zachowanie. Pomóż mi naprawdę zrozumieć przydatność Dekoratora i dlaczego moje myślenie dla początkujących jest wadliwe?