Wzór Strategii V / S Wzór Dekoratora

Właśnie natknąłem się na dwa wzory.

  1. Wzór Strategii

  2. Dekorator

Wzór Strategii: -

Wzór strategii daje kilka algorytmów, które można wykorzystać do wykonania konkretnej operacji lub zadania.

Wzór Dekoratora:-

Wzór dekoratora dodaje pewną funkcjonalność do komponentu.

W rzeczywistości odkryłem, że Strategia wzór i dekorator wzór może być również używane zamiennie.

Oto link :- kiedy i W Jaki Sposób można zastosować wzór strategii zamiast wzoru dekoratora?

Jaka jest różnica między wzorem strategii a wzorem dekoratora?

Kiedy należy stosować wzór strategii, a kiedy wzór dekoratora?

Wyjaśnij różnicę między nimi za pomocą tego samego przykładu.

Author: Ravindra babu, 2014-10-17

5 answers

Wzorzec strategii pozwala zmienić implementację czegoś używanego w czasie wykonywania.

Wzór dekoratora pozwala rozszerzyć (lub dodać) istniejącą funkcjonalność o dodatkową funkcjonalność w czasie wykonywania.

Kluczową różnicą jest zmiana vs augment

W jednym z pytań związanych z nim również zwraca uwagę, że ze wzorem strategii konsument jest świadomy, że istnieją różne opcje, podczas gdy z wzór dekoratora konsument nie byłby świadomy dodatkowej funkcjonalności.

Jako przykład, wyobraź sobie, że piszesz coś, aby posortować zbiór elementów. Więc pisząc Interfejs ISortingStrategy możesz zaimplementować kilka różnych strategii sortowania BubbleSortStrategy, QuickSortStrategy, RadixSortStrategy, Następnie Twoja aplikacja, na podstawie niektórych kryteriów istniejącej listy, wybiera najbardziej odpowiednią strategię do posortowania listy. Więc na przykład jeśli lista ma mniej niż 10 pozycji użyjemy RadixSortStrategy, Jeśli mniej niż 10 pozycji zostało dodanych do listy od ostatniego sortowania, którego użyjemy BubbleSortStrategy, w przeciwnym razie użyjemy QuickSortStrategy.

Zmieniamy Typ sortowania w czasie wykonywania (aby był bardziej efektywny w oparciu o dodatkowe informacje.) jest to wzór strategii.

Teraz wyobraź sobie, że ktoś prosi nas o podanie dziennika, jak często każdy algorytm sortowania jest używany do rzeczywistego sortowania i aby ograniczyć sortowanie do administratorów. Możemy dodać oba te elementy funkcjonalności tworząc dekorator, który enhances any ISortingStrategy. Możemy stworzyć dekoratora, który rejestruje, że został użyty do sortowania czegoś i rodzaju dekorowanej strategii sortowania. I możemy dodać kolejny dekorator, który sprawdzał, czy obecny użytkownik był administratorem, zanim wywołał dekoratorską strategię sortowania.

Tutaj dodajemy nową funkcjonalność do każdej strategii sortowania za pomocą dekoratora, ale nie zamieniamy podstawowej funkcjonalności sortowania (użyliśmy różnych strategii, aby zmienić that)

Oto przykład, jak mogą wyglądać dekoratorzy:
public interface ISortingStrategy
{
    void Sort(IList<int> listToSort);
}

public class LoggingDecorator : ISortingStrategy
{
    private ISortingStrategy decorated;
    public LoggingDecorator(ISortingStrategy decorated)
    {
         this.decorated=decorated;
    }

    void Sort(IList<int> listToSort)
    { 
         Log("sorting using the strategy: " + decorated.ToString();
         decorated.Sort(listToSort);
    }
}

public class AuthorisingDecorator : ISortingStrategy
{
    private ISortingStrategy decorated;
    public AuthorisingDecorator(ISortingStrategy decorated)
    {
         this.decorated=decorated;
    }

    void Sort(IList<int> listToSort)
    { 
         if (CurrentUserIsAdministrator())
         {
             decorated.Sort(listToSort);
         }
         else
         {
             throw new UserNotAuthorizedException("Only administrators are allowed to sort");
         }
    }
}
 76
Author: Sam Holder,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-08-20 16:03:28

Strategy_pattern

  1. definiuje rodzinę algorytmów,
  2. Enkapsuje każdy algorytm i
  3. sprawia, że algorytmy są wymienne w obrębie tej rodziny.

użyj wzorca strategii, gdy musisz dynamicznie zmieniać algorytm w czasie wykonywania.

Dekorator

dekorator wzorzec dynamicznie zmienia funkcjonalność obiektu w czasie wykonywania bez wpływu na istniejące funkcjonalność obiektów.

Kiedy stosować:

  1. dodawanie dodatkowych funkcjonalności/obowiązków dynamicznie
  2. Usuń funkcjonalności/obowiązki dynamicznie
  3. unikaj zbyt dużego podklasowania, aby dodać dodatkowe obowiązki.

Wady:

  1. nadużywanie zasady otwartej zamkniętej(otwartej dla rozszerzenia i zamkniętej dla modyfikacji). Użyj tej funkcji oszczędnie tam, gdzie kod jest najmniej prawdopodobny zmieniony.
  2. zbyt wiele małych klas i zwiększy koszty utrzymania.

Kluczowa różnica:

strategia pozwala zmienić wnętrzności obiektu. Dekorator pozwala zmienić skórę.

Kilka przydatnych postów:

Kiedy stosować wzór dekoratora?

Rzeczywisty przykład wzorca strategii

Strategia by sourcemaking

 8
Author: Ravindra babu,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-09-20 06:17:13

The strategy is pattern is used to "encapsulate what changes". Pozwala definiować algorytmy, które mogą być wymienne w czasie wykonywania. Na przykład (przykład zaczerpnięty z wzorców projektowych Head First):

Powiedzmy, że masz symulator kaczki. Chcesz, aby twoje obiekty kaczki latać. Możesz użyć dziedziczenia do tego, ale szybko robi się bałagan. Niektóre kaczki nie potrafią latać (np. kaczki gumowe). Sposobem na to jest zakapsulowanie tego, co zmienia tj. zachowanie fly do własnej klasy, która implementuje IFlybehaviour na przykład. Następnie możesz użyć kompozycji zamiast dziedziczenia i wstrzyknąć IFlybehaviour do obiektów kaczki. Można również wtedy mieć metodę, która ustawia to zachowanie fly tak, że zachowanie fly można zmienić w czasie wykonywania. Jest to zasadniczo wzór strategii.

Wzorzec dekoratora służy do dodawania funkcjonalności do obiektu w czasie wykonywania. Umożliwia zawijanie obiektów wewnątrz obiektów. Dekoratorzy muszą mieć ten sam supertyp, co przedmioty, które dekorują. To pozwala na wywołanie metody na "outmost wrapper", a następnie można wywołać łańcuchowo tę samą metodę w dół przez warstwy dekoratorów. Jest to zasadniczo bardziej elastyczne podejście niż podklasowanie.

To, które z nich wybierzesz, zależy od problemu, który chcesz rozwiązać. Czy chcesz mieć rodzinę algorytmów, które są wymienne w czasie wykonywania, czy chcesz dynamicznie dodać więcej funkcjonalności do obiektu w czasie wykonywania?

Książka "Head first design patterns" wyjaśnia to całkiem dobrze (chyba dużo lepiej niż ja) IMO więc warto przeczytać, jeśli masz szansę.

Powodzenia.

 5
Author: Magrangs,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-10-17 10:34:20

Sprowadza się do tego: użyj strategii, aby wybrać jeden element podstawowej funkcjonalności. Użyj dekoratora, aby dodać dodatkową funkcjonalność. Strategia to ciasto, które robimy, a dekorator to wszystkie piękne dekoracje, które do niego dodajemy.

 1
Author: kirk.burleson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-07-08 18:26:24

Dekorator ma na celu dodanie dodatkowej funkcjonalności do instancji klasy, więc jest zaimplementowany w runtime dynamically.It jest wzorcem zachowań. Ze względu na praktyczne warunki, w których Podklasowanie jest z powrotem łamanie. Strategia jest wzorem, w którym różne obiekty Strategii mają tę samą abstrakcyjną funkcję, konkretny obiekt kontekstowy można skonfigurować w czasie wykonywania z konkretnym obiektem strategii zbioru rodzinnego. Jako MVC, kontroler jest przypadkiem roli strategicznej, widok struktura danych wyjściowych, podczas gdy-as Kontrolery będą różne w czasie wykonywania, które dynamicznie zmieniają dane wyjściowe widoku.

 0
Author: YoungJeXu,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-01-24 03:58:56