Czy możesz podać jakieś dobre wyjaśnienie, jaka jest różnica między proxy a dekoratorem ?
Główną różnicą, którą widzę, jest to, że kiedy zakładamy, że proxy używa kompozycji, a dekorator używa agregacji , wydaje się jasne, że używając wielu (jednego lub więcej) dekoratorów można modyfikować / dodawać funkcje do wcześniej istniejącej instancji (dekorować), podczas gdy Proxy ma własne wewnętrzne wystąpienie klasy proxy i delegatów do niej dodających dodatkowe funkcje (zachowanie proxy).
Pytanie brzmi - czy proxy utworzone za pomocą agregacji jest nadal proxy, czy raczej dekoratorem ? Czy dozwolone jest (z definicji we wzorcach GoF) tworzenie proxy z agregacją?
oop
design-patterns
decorator
proxy-pattern
Łukasz Rzeszotarski
źródło
źródło
Odpowiedzi:
Oto bezpośredni cytat z GoF (strona 216).
Popularne odpowiedzi wskazują, że Pełnomocnik zna konkretny typ swojego pełnomocnika. Z tego cytatu widać, że nie zawsze jest to prawdą.
Różnica między proxy a dekoratorem według GoF polega na tym, że proxy ogranicza klienta. Dekorator tego nie robi. Proxy może ograniczyć to, co robi klient , kontrolując dostęp do funkcji; lub może ograniczyć to, co wie klient , wykonując czynności, które są dla niego niewidoczne i nieznane. Dekorator postępuje odwrotnie: wzmacnia to, co robi jego delegat, w sposób widoczny dla klientów.
Można powiedzieć, że proxy to czarne pudełko, a dekorator to białe pudełko.
Relacja kompozycyjna między opakowaniem a delegatem jest niewłaściwą relacją, na której należy się skupić, porównując proxy z dekoratorem, ponieważ kompozycja jest cechą wspólną tych dwóch wzorców. Relacja między opakowaniem a klientem jest tym, co odróżnia te dwa wzorce.
źródło
Prawdziwą różnicą nie jest własność (skład a agregacja), ale raczej informacja o typie.
Dekorator jest zawsze przeszedł przekazano. Proxy może go utworzyć sam, lub że może mieć on wstrzykiwany.
Ale Pełnomocnik zawsze zna (bardziej) konkretny typ delegata. Innymi słowy, proxy i jego delegat będą mieć ten sam typ podstawowy, ale proxy wskazuje na jakiś typ pochodny. Dekorator wskazuje na własnym typie bazowym. Zatem różnica polega na informacjach w czasie kompilacji o typie delegata.
W języku dynamicznym, jeśli delegat jest wstrzykiwany i ma ten sam interfejs, nie ma różnicy.
Odpowiedź na Twoje pytanie brzmi „Tak”.
źródło
Wzorzec dekoratora skupia się na dynamicznym dodawaniu funkcji do obiektu, podczas gdy Wzorzec proxy skupia się na kontrolowaniu dostępu do obiektu.
EDYTOWAĆ:-
Relacja między serwerem proxy a rzeczywistym tematem jest zwykle ustawiana w czasie kompilacji, serwer proxy tworzy go w jakiś sposób, podczas gdy dekorator jest przypisywany do tematu w czasie wykonywania, znając tylko interfejs podmiotu.
źródło
Dekorator otrzymuje referencje dla dekorowanego obiektu (zwykle przez konstruktora), podczas gdy Proxy jest za to odpowiedzialny.
Proxy może w ogóle nie tworzyć instancji zawijającego obiektu (tak jak robi to ORM, aby zapobiec niepotrzebnemu dostępowi do bazy danych, jeśli nie są używane pola obiektów / metody pobierające), podczas gdy Dekorator zawsze utrzymuje łącze do rzeczywistej opakowanej instancji.
Serwer proxy zwykle używany przez frameworki do dodawania zabezpieczeń lub buforowania / lazowania i konstruowany przez framework (nie przez zwykłego programistę).
Dekorator jest zwykle używany do dodawania nowego zachowania do starych lub starszych klas przez samego programistę w oparciu o interfejs, a nie rzeczywistą klasę (więc działa na szerokiej gamie instancji interfejsu, Proxy jest wokół konkretnej klasy).
źródło
Kluczowe różnice:
Artykuł Sourcemaking znakomicie cytuje podobieństwa i różnice.
Powiązane pytania / linki dotyczące SE:
Kiedy używać wzoru dekoratora?
Jaka jest dokładna różnica między wzorcami adaptera i serwera proxy?
źródło
Proxy i Decorator różnią się przeznaczeniem i miejscem, w którym koncentrują się na wewnętrznej implementacji. Serwer proxy służy do korzystania ze zdalnego, wieloprocesowego lub międzysieciowego obiektu tak, jakby był obiektem lokalnym. Dekorator służy do dodawania nowego zachowania do oryginalnego interfejsu.
Chociaż oba wzorce mają podobną strukturę, większość złożoności Proxy polega na zapewnieniu właściwej komunikacji z obiektem źródłowym. Dekorator natomiast skupia się na implementacji dodanego zachowania.
źródło
Zajęło trochę czasu, zanim zrozumiałem tę odpowiedź i co to naprawdę oznacza. Kilka przykładów powinno wyjaśnić sprawę.
Proxy
pierwszy:I :
I jest ten rozmówca
Authorization
, całkiem głupi:Na razie nic niezwykłego, prawda? Uzyskaj token z określonej usługi, użyj tego tokena. Teraz pojawia się jeszcze jedno wymaganie do obrazu, dodaj logowanie: co oznacza, że loguj token za każdym razem. W tym przypadku jest to proste, po prostu utwórz
Proxy
:Jak byśmy to wykorzystali?
Zauważ, że
LoggingDBAuthorization
zawiera wystąpienieDBAuthorization
. ZarównoLoggingDBAuthorization
iDBAuthorization
implementujAuthorization
.DBAuthorization
) interfejsu podstawowego (Authorization
). Innymi słowy, Pełnomocnik dokładnie wie , co jest przekazywane.Decorator
:Zaczyna się prawie tak samo jak
Proxy
z interfejsem:i jego wdrożenie:
A teraz chcemy dodać bardziej doświadczonego kandydata, który dodaje wynik rozmowy kwalifikacyjnej plus jeden od drugiego
JobSeeker
:Zwróć uwagę, jak powiedziałem to plus ten od innego Poszukiwacza pracy , nie
Newbie
. ADecorator
nie wie dokładnie, co ozdabia, zna tylko kontrakt tej zdobionej instancji (o czym wieJobSeeker
). Zwróć uwagę, że to nie jest podobne doProxy
; który z kolei dokładnie wie, co ozdabia.Możesz zapytać, czy w tym przypadku jest jakaś różnica między tymi dwoma wzorcami projektowymi? A co by było, gdybyśmy spróbowali napisać
Decorator
jako aProxy
?Jest to zdecydowanie opcja i podkreśla, jak bliskie są te wzorce; są one nadal przeznaczone dla różnych scenariuszy, jak wyjaśniono w innych odpowiedziach.
źródło
Serwer proxy zapewnia ten sam interfejs dla opakowanego obiektu, dekorator zapewnia mu ulepszony interfejs, a serwer proxy zwykle samodzielnie zarządza cyklem życia obiektu usługi, podczas gdy skład dekoratorów jest zawsze kontrolowany przez klienta.
źródło