Uczyłem się Wzorzec Dekorator co zostało udokumentowane w GOF .
Proszę, pomóż mi zrozumieć Wzorzec Dekoratora . Czy ktoś mógłby podać przykład użycia, w którym jest to przydatne w prawdziwym świecie?
decorator
design-patterns
odiseh
źródło
źródło
Odpowiedzi:
Rozważmy przykład pizzerii. W pizzerii sprzedadzą kilka odmian pizzy, a także zapewnią dodatki do menu. Teraz wyobraź sobie sytuację, w której pizzeria musi podawać ceny za każdą kombinację pizzy i dodatków. Nawet jeśli są cztery podstawowe pizze i 8 różnych dodatków, aplikacja oszalałaby, zachowując wszystkie te konkretne kombinacje pizzy i dodatków.
Oto wzór dekoratora.
Zgodnie ze wzorem dekoratora, zastosujesz dodatki, ponieważ dekoratorzy i pizze będą dekorowane przez dekoratorów tych dodatków. Praktycznie każdy klient chciałby mieć dodatki według własnego uznania, a ostateczna kwota rachunku składać się będzie z podstawowej pizzy i dodatkowo zamówionych dodatków. Każdy dekorator dodatków wiedziałby o pizzy, którą ozdabia i jaka jest cena. Metoda GetPrice () obiektu Topping zwróciłaby skumulowaną cenę zarówno pizzy, jak i dodatku.
EDYTOWAĆ
Oto przykład kodu wyjaśnienia powyżej.
źródło
To jest prosty przykład dynamicznego dodawania nowego zachowania do istniejącego obiektu lub wzorca dekoratora. Ze względu na naturę języków dynamicznych, takich jak JavaScript, wzorzec ten staje się częścią samego języka.
źródło
switch
lub simpleif
, można by powiedzieć, że jest to świetny przykład dynamicznego dodawania zachowania do klasy, ale potrzebujemy co najmniej dwóch klas, aby zdefiniować dekorator i dekorowane obiekty w tym wzorze.Warto zauważyć, że model we / wy Java jest oparty na wzorcu dekoratora. Warstwowanie tego czytnika na tym czytniku na wierzchu ... jest naprawdę prawdziwym przykładem dekoratora.
źródło
Przykład - scenariusz - powiedzmy, że piszesz moduł szyfrowania. To szyfrowanie może zaszyfrować czysty plik przy użyciu standardu szyfrowania DES - Data. Podobnie w systemie możesz mieć szyfrowanie w standardzie szyfrowania AES - Advance. Możesz także mieć kombinację szyfrowania - najpierw DES, a następnie AES. Lub możesz mieć najpierw AES, a następnie DES.
Dyskusja - Jak poradzisz sobie w tej sytuacji? Nie możesz dalej tworzyć obiektu takich kombinacji - na przykład - AES i DES - łącznie 4 kombinacje. Dlatego musisz mieć 4 oddzielne obiekty. Stanie się to skomplikowane wraz ze wzrostem typu szyfrowania.
Rozwiązanie - Kontynuuj tworzenie stosu - kombinacje w zależności od potrzeb - w czasie wykonywania. Kolejną zaletą tego podejścia do stosu jest to, że można go łatwo rozwinąć.
Oto rozwiązanie - w C ++.
Po pierwsze, potrzebujesz klasy bazowej - podstawowej jednostki stosu. Możesz myśleć jako podstawa stosu. W tym przykładzie jest to czysty plik. Postępujmy zawsze zgodnie z polimorfizmem. Najpierw utwórz klasę interfejsu tej podstawowej jednostki. W ten sposób możesz zaimplementować to, jak chcesz. Nie musisz też myśleć o zależności, włączając tę podstawową jednostkę.
Oto klasa interfejsu -
Teraz zaimplementuj tę klasę interfejsu -
Teraz stwórzmy abstrakcyjną klasę dekoratora - którą można rozszerzyć, aby stworzyć dowolny rodzaj smaków - tutaj smak jest typem szyfrowania. Ta abstrakcyjna klasa dekoratora jest powiązana z klasą bazową. Zatem dekorator „jest” rodzajem klasy interfejsu. Dlatego musisz użyć dziedziczenia.
Teraz zróbmy konkretną klasę dekoratora - Typ szyfrowania - AES -
Powiedzmy teraz, że typ dekoratora to DES -
const std :: string desEncrypt = "DES Encrypted";
Zróbmy kod klienta, który będzie używał tej klasy dekoratora -
Zobaczysz następujące wyniki -
Oto diagram UML - reprezentacja klasy. W przypadku, gdy chcesz pominąć kod i skupić się na aspekcie projektowym.
źródło
strategy pattern
?Wzorzec dekoratora pomaga zmienić lub skonfigurować funkcjonalność obiektu przez tworzenie łańcuchów z innymi podobnymi podklasami tego obiektu.
Najlepszym przykładem mogą być klasy InputStream i OutputStream w pakiecie java.io
źródło
Co to jest wzorzec projektowy dekoratora w języku Java.
Formalna definicja wzorca dekoratora z książki GoF (Design Patterns: Elements of Reusable Object-Oriented Software, 1995, Pearson Education, Inc. Publishing as Pearson Addison Wesley) mówi, że możesz,
„Dynamicznie przypisuj dodatkowe obowiązki do obiektu. Dekoratory stanowią elastyczną alternatywę dla tworzenia podklas w celu rozszerzenia funkcjonalności”.
Powiedzmy, że mamy pizzę i chcemy ją ozdobić dodatkami, takimi jak kurczak masala, cebula i ser mozzarella. Zobaczmy, jak zaimplementować to w Javie ...
Program do demonstracji sposobu implementacji wzorca projektowego dekoratora w języku Java.
Pizza.java:
źródło
W mojej pracy intensywnie używałem wzoru dekoratora. Zrobiłem post na moim blogu o tym, jak używać go z logowaniem.
źródło
Weźmy przykład, w którym musisz zbudować aplikację, która oblicza ceny różnych rodzajów hamburgerów. Musisz poradzić sobie z różnymi wariantami burgerów, takimi jak „duże” lub „z serem”, z których każdy ma cenę w stosunku do podstawowego burgera. Np. Dodaj 10 $ za burgera z serem, dodaj dodatkowe 15 $ za dużego burgera itp.
W takim przypadku możesz ulec pokusie tworzenia podklas do ich obsługi. Możemy to wyrazić w Rubim jako:
W powyższym przykładzie klasa BurgerWithCheese dziedziczy po Burgerze i zastępuje metodę ceny, dodając 15 USD do ceny zdefiniowanej w superklasie. Utworzyłbyś również klasę LargeBurger i zdefiniowałbyś cenę w stosunku do Burgera. Ale musisz także zdefiniować nową klasę dla kombinacji „duże” i „z serem”.
A co się stanie, jeśli będziemy musieli podać „burgera z frytkami”? Mamy już 4 klasy do obsługi tych kombinacji i będziemy musieli dodać 4 kolejne, aby obsłużyć wszystkie kombinacje 3 właściwości - „duże”, „z serem” i „z frytkami”. Potrzebujemy teraz 8 klas. Dodaj kolejną właściwość, a będziemy potrzebować 16. To będzie rosło jako 2 ^ n.
Zamiast tego spróbujmy zdefiniować BurgerDecorator, który przyjmuje obiekt Burger:
W powyższym przykładzie utworzyliśmy klasę BurgerDecorator, z której dziedziczy klasa BurgerWithCheese. Możemy również przedstawić „dużą” odmianę, tworząc klasę LargeBurger. Teraz możemy zdefiniować dużego burgera z serem w czasie wykonywania jako:
Pamiętasz, jak użycie dziedziczenia w celu dodania odmiany „z frytkami” wymagałoby dodania 4 kolejnych podklas? W przypadku dekoratorów utworzylibyśmy po prostu jedną nową klasę, BurgerWithFries, do obsługi nowej odmiany i obsługi tego w czasie wykonywania. Każda nowa nieruchomość wymagałaby więcej dekoratora, aby pokryć wszystkie permutacje.
PS. To jest krótka wersja artykułu, który napisałem o używaniu wzoru dekoratora w języku Ruby , który możesz przeczytać, jeśli chcesz poznać bardziej szczegółowe przykłady.
źródło
Dekorator:
Odnosić się do znaleźć w artykule o wytwarzaniu źródeł .
Dekorator (abstrakcyjny) : jest to abstrakcyjna klasa / interfejs, który implementuje interfejs komponentu. Zawiera interfejs komponentowy. W przypadku braku tej klasy, potrzebujesz wielu podklas ConcreteDecorators dla różnych kombinacji. Kompozycja komponentu redukuje niepotrzebne podklasy.
Przykład JDK:
Spójrz na poniższe pytanie SE dotyczące diagramu UML i przykładów kodu.
Wzorzec dekoratora dla IO
Przydatne artykuły:
journaldev
wikipedia
Prawdziwy przykład wzoru dekoratora: VendingMachineDecorator został wyjaśniony @
Kiedy używać wzoru dekoratora?
W powyższym przykładzie herbata lub kawa (napój) została ozdobiona cukrem i cytryną.
źródło
Wzór dekoratora osiąga jeden cel, jakim jest dynamiczne dodawanie obowiązków do dowolnego obiektu .
Model we / wy Java jest oparty na wzorcu dekoratora.
źródło
W Wikipedii jest przykład ozdabiania okna paskiem przewijania:
http://en.wikipedia.org/wiki/Decorator_pattern
Oto kolejny przykład „członka zespołu, kierownika zespołu i menedżera” w bardzo „prawdziwym świecie”, który ilustruje, że wzór dekoratora jest niezastąpiony przy prostym dziedziczeniu:
https://zishanbilal.wordpress.com/2011/04/28/design-patterns-by-examples-decorator-pattern/
źródło
Jakiś czas temu refaktoryzowałem kod źródłowy do użycia wzorca dekoratora, więc spróbuję wyjaśnić przypadek użycia.
Załóżmy, że mamy zestaw usług i na podstawie tego, czy użytkownik nabył licencję na daną usługę, musimy uruchomić usługę.
Wszystkie usługi mają wspólny interfejs
Wstępna refaktoryzacja
Jeśli uważnie obserwujesz,
ServiceSupport
jest zależny odLicenseManager
. Ale dlaczego miałoby to zależećLicenseManager
? A gdybyśmy potrzebowali usługi w tle, która nie musi sprawdzać informacji o licencji. W obecnej sytuacji będziemy musieli jakoś trenować,LicenseManager
aby wrócićtrue
do usług w tle. To podejście nie wydawało mi się dobre. Według mnie sprawdzanie licencji i inne logiki były względem siebie ortogonalne.Tak więc Decorator Pattern przychodzi na ratunek i tutaj zaczyna się refaktoryzacja z TDD.
Post refaktoryzacja
Dania na wynos
źródło
Weźmy na przykład PubG. Karabiny szturmowe działają najlepiej z 4-krotnym zoomem, a skoro już przy nim jesteśmy, potrzebowalibyśmy też kompensatora i tłumika. Zmniejszy to odrzut i dźwięk wystrzału oraz echo. Będziemy musieli zaimplementować tę funkcję, aby umożliwić graczom zakup ulubionej broni i akcesoriów. Gracze mogą kupić broń lub niektóre z akcesoriów lub wszystkie akcesoria i zostaną odpowiednio obciążeni.
Zobaczmy, jak jest stosowany wzór dekoratora:
Załóżmy, że ktoś chce kupić SCAR-L ze wszystkimi trzema wymienionymi powyżej akcesoriami.
Doprowadzi to do następującego diagramu klas:
Teraz możemy mieć takie zajęcia:
Podobnie możemy dodać inne akcesoria i ozdobić naszą broń.
Odniesienie:
https://nulpointerexception.com/2019/05/05/a-beginner-guide-to-decorator-pattern/
źródło
Wzorzec projektowy dekoratora : ten wzorzec pomaga modyfikować właściwości obiektu w czasie wykonywania. Zapewnia różne smaki przedmiotowi i daje elastyczność w wyborze składników, których chcemy użyć w tym smaku.
Przykład z życia wzięty: Załóżmy, że podczas lotu masz główne miejsce w kabinie. Teraz możesz wybrać wiele udogodnień z miejscem do siedzenia. Każde udogodnienie ma swój własny koszt. Teraz, jeśli użytkownik wybierze Wi-Fi i jedzenie premium, zostanie obciążony opłatą za miejsce + Wi-Fi + jedzenie premium.
W tym przypadku wzór projektowy dekoratora może nam naprawdę pomóc. Odwiedź powyższy link, aby dowiedzieć się więcej o wzorach dekoratorów i wdrożeniu jednego przykładu z życia.
źródło