Wzór budowniczy Vs dekorator

Od kiedy użyjesz wzoru Builder?,

Mówi się, że wzór konstruktora jest odpowiedni dla przykładu pizzy.

Dlaczego nie dekorator ? traktując ser, Pepperoni, boczek jako dodatkową dekorację na pizzy bazowej.

Czy to dlatego, że ser / Pepperoni muszą być budowane osobno? Nie sądzę, muszą być budowane osobno, ponieważ mogą być dostępne gotowe.

Pls Szukam również dobrego przykładu z realnego świata wzór dekoratora i powód, dla którego jest odpowiedni dla tego konkretnego przykładu. Dziękuję.

Author: Community, 2011-01-22

4 answers

Z artykułu wzór dekoratora Wikipedii:

W programowaniu obiektowym, wzór dekoratora to wzór projektowy co pozwala na nowe / dodatkowe zachowanie do dodania do istniejącego obiektu dynamicznie.

Nie ma potrzeby dodawania dodatków do pizzy po jej pełnym przygotowaniu. Nie jesz połowy pizzy, a potem dodajesz do niej kolejną polewę.

Innymi słowy, wzorzec Builder ułatwia skonstruowanie obiektu, który jest możliwość rozszerzenia w niezależnych kierunkach w czasie budowy, podczas gdy wzór dekoratora pozwala na dodanie rozszerzeń funkcjonalności do obiektu po czasie budowy. Używanie wzorca dekoratora do konstruowania obiektów jest złe, ponieważ pozostawia obiekt w niespójnym (lub przynajmniej nieprawidłowym) stanie, dopóki wszystkie wymagane dekoratory nie zostaną na swoim miejscu - podobnie jak w JavaBean problem z używaniem setterów do określania argumentów opcjonalnego konstruktora.

 39
Author: Philip Potter,
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
2011-01-22 14:44:19

Mylisz dwie bardzo różne rzeczy. GoF klasyfikuje konstruktora jako wzór kreacyjny, podczas gdy dekorator jest wzorem strukturalnym. Są one opisane w następujący sposób (Gamma et al, strona 1):

Builder (97) oddziela konstrukcję złożonego obiektu od jego reprezentacji, tak aby ten sam proces budowy mógł tworzyć różne reprezentacje.

Dekorator (175) dołączanie dodatkowych obowiązków do obiektu dynamicznie. dekoratory stanowią elastyczną alternatywę dla podklasowania w celu rozszerzenia funkcjonalności.

Zwróć uwagę na dekoratora. To elastyczna alternatywa dla podklasowania. Podklasowanie jest używane do modelowania relacji is-a. Ser to nie pizza. Pizza składa się [[6]}z wielu składników i jest zwykle modelowana za pomocą kompozycji.

Wzorzec budowniczy jest tutaj istotny, ponieważ istnieje tak ogromna liczba składników, że powstaje potrzeba skonstruowania ich w standaryzowany sposób.

Aby wziąć przykład z dekoratora w prawdziwym świecie, chciałem ostatnio rejestrować zapytania wykonywane przy użyciu jdbc w mojej aplikacji java. Udało mi się to dzięki implementacji klasy o nazwie LoggingConnection, która rozszerzyła interfejs połączenia.

public class LoggingConnection implements Connection
{
    public static class LogEntry
    {
        public String sql;
        public int invocationCount;
        public double avgTime;
        public double maxTime;
    }

    private Connection delegate;

    private Map<String, LogEntry> log;

    public LoggingConnection(Connection delegate)
    {
        this.delegate = delegate;
        this.log = new HashMap<String, LogEntry>();
    }

    public Map<String, LogEntry> getLog()
    {
        return log;
    }

    @Override
    public void clearWarnings()
    throws SQLException
    {
        delegate.clearWarnings();
    }

    @Override
    public void close()
    throws SQLException
    {
        delegate.close();
    }

    // forwarding declarations to all other methods declared in the interface
    ...
}

To pozwala mi przekazać konkretną implementację połączenia i rozszerzyć jego funkcjonalność w czasie wykonywania. Podklasowanie byłoby problematyczne w tym kontekście, ponieważ nie koniecznie wiedzieć, jaki obiekt connection jest zwracany. Dzieje się tak, ponieważ jest on skonstruowany dla Ciebie za pomocą fabryki DriverManager:

Connection conn = DriverManger.getConnection(dsn);

Obiekt conn jest w tym przypadku implementacją zawartą w driverze, którego ogólnie nie znam nazwy. Zaletą podejścia dekoratora jest to, że nie muszę wiedzieć, i że nie jest to związane z konkretną realizacją.

 20
Author: Emil H,
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
2011-01-22 15:04:46

Przejdźmy do kluczowych cech Builder i Decorator .

Builder : (wzór kreacyjny)

  1. zbyt wiele argumentów, aby przejść z programu klienta do klasy Factory, która może być podatna na błędy
  2. Niektóre parametry mogą być opcjonalne, w przeciwieństwie do fabrycznych, które wymuszają wysłanie wszystkich parametrów]}
  3. obiekt jest ciężki, a jego tworzenie jest złożone. np. budowa różnego rodzaju pizz

Dekorator : (Wzór strukturalny)

  1. Dodaj zachowanie do obiektu w czasie działania. Dziedziczenie jest kluczem do osiągnięcia tej funkcjonalności, co jest zarówno zaletą, jak i wadą tego wzoru.
  2. poprawia zachowanie interfejsu.
  3. dekorator może być postrzegany jako zdegenerowany kompozyt z tylko jednym składnikiem. Jednak dekorator dodaje dodatkowe obowiązki - nie jest przeznaczony do agregacji obiektów.
  4. dekorator obsługuje rekurencyjne skład
  5. dekorator został zaprojektowany, aby umożliwić dodawanie obowiązków do obiektów bez podkategorii

Kiedy używać dekoratora :

  1. obowiązki i zachowania obiektu powinny być dynamicznie dodawane / usuwane
  2. konkretne wdrożenia powinny być oddzielone od odpowiedzialności i zachowań
  3. gdy podklasowanie jest zbyt kosztowne, aby dynamicznie dodawać / usuwać obowiązki

Coming back to your zapytanie:

Builder {[3] } jest właściwym wzorem kreacyjnym dla pizzy. Pizza jest tworzona z obowiązkowych składników początkowo (chleb itp.). Ser, Pepperoni, bekon są opcjonalnymi składnikami, ale nadal mogą być częścią pizzy podczas procesu budowy.

dekorator jest przydatny do dodawania dynamicznych obowiązków w czasie wykonywania dla już utworzonego obiektu.

Np. :

BufferedInputStream bis = new BufferedInputStream(new FileInputStream(new File("a.txt")));

Zobacz poniższe posty, aby uzyskać więcej szczegółów:

Utrzymanie Buildera w osobnej klasie

Kiedy stosować wzór dekoratora?

 4
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 07:29:30

Wzorzec budowniczy jest specjalnie używany do budowania i dekoratora, aby dodać specjalne funkcje po budowaniu. np. w powyższym przykładzie Pizza możemy zdecydować się na użycie jednego z dwóch wzorców bazujących na domenie problemu.

Jeśli płatki Chilli są niezbędne do pizzy i podobnie mamy wiele składników do dodania do pizzy, z których niewiele jest elementarnych, aby Pizza była jadalna( stan sensowny), możemy preferować Builder. Po zbudowaniu pizzy możemy ją później udekorować różne dodatki, takie jak sos pomidorowy, oliwki itp...

Ponadto, jest poprawnie powiedziane powyżej, że mogą być używane razem, ale to zwiększy złożoność. Powinniśmy więc mądrze używać wzorców tylko wtedy, gdy jest to potrzebne w dziedzinie problemu, w przeciwnym razie wystarczy prosta konstrukcja.

 1
Author: andy2375,
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-02-22 19:04:21