Wzory Ruby on Rails - dekorator vs prezenter

112

Ostatnio w społeczności Ruby on Rails mówi się o dekoratorach i prezenterach.

Jaka jest zasadnicza różnica między nimi? Jeśli tak, jakie są wskazówki, które podpowiadają mi, którego użyć zamiast drugiego? A może użyć tych dwóch w połączeniu?

keruilin
źródło

Odpowiedzi:

102

Dekorator to raczej „dodajmy jakąś funkcjonalność do tej jednostki”. Prezenter to raczej „zbudujmy pomost między modelem / zapleczem a widokiem”. Wzór prezentera ma kilka interpretacji.

Dekoratory mają charakter ogólny / ogólnego przeznaczenia. Prezenterzy mają węższy zakres obowiązków / zastosowań. Dekoratory są używane w różnych domenach, prezenterzy są prawie zawsze związani z funkcjami podobnymi do wyświetlania.

Dave Newton
źródło
3
Dzięki. Wygląda na to, że Draper Gem to hybryda prezentera i dekoratora.
keruilin
17
@keruilin Jedna rzecz, o której należy pamiętać: dekoratorzy powinni naprawdę móc dekorować inne dekoratory (a także dekorować obiekt składowy), ponieważ jednym z ich celów jest obejście ograniczeń dziedziczenia. (Draper tego nie robi). W tym sensie wzór dekoratora jest bardzo podobny do wzoru złożonego, z wyjątkiem tego, że jest obsługiwany od zewnątrz do wewnątrz zamiast od wewnątrz (jeśli ma to sens).
rozmazywanie
7
Postrzegam dekorator jako wzorzec ogólnego przeznaczenia, a prezentera jako konkretne zastosowanie dekoratora związane z warstwą widoku.
Kris,
2
@Smudge, dekoratorzy draperów mogą dekorować inne dekoracje, przynajmniej tak, jakby podstawowe modele miały związek STI.
keruilin
Wygląda na to, że teraz Draper identyfikuje się jako opakowanie warstwy prezentacji - więc nie jest już dekoratorem, ale właściwie prezenterem. Z ich GH: "Draper dodaje obiektową warstwę logiki prezentacji do twojej aplikacji Railsowej."
Jared
35

Proponuję to sprawdzić - Wystawa kontra prezenter .

Dekorator to wzorzec projektowy, który służy do rozszerzania funkcjonalności określonego obiektu poprzez zawijanie go bez wpływu na inne wystąpienia tego obiektu. Ogólnie wzorzec dekoratora jest przykładem zasady otwórz / zamknij (klasa jest zamknięta dla modyfikacji, ale dostępna dla rozszerzeń).

Wzory eksponatu i prezentera są rodzajem wzoru dekoratora.

dpaluy
źródło
+1 za link do tego posta na blogu autorstwa Mike Pack. Znakomity post, który wyjaśnia różnice między wzorami.
ki4jnq
+1 za wzmiankę o wzorze ekspozycji. Skończyło się na tym, że dostałem książkę Avdiego Grimma, która to wyjaśnia. Chociaż nie było to dobre rozwiązanie mojego problemu, to wciąż jest niesamowity wzór. Doskonałe do przemyśleń.
Yonk