Różnica między wzorami projektowymi elewacji, proxy, adaptera i dekoratora? [Zamknięte]

135

Jaka jest różnica między wzorcami projektowymi Fasada, Proxy, Adapter i Dekorator?

Nigdy nie czytałem jasnego wyjaśnienia, jakie jest twoje?

user310291
źródło
@gavenkoa drugie pytanie dotyczy tylko proxy i dekoratora
user310291
2
Niesamowite, ponieważ niektóre zamknięte pytania okazują się tak przydatne.
Łukasz

Odpowiedzi:

285

Adapter dostosowuje daną klasę / obiekt do nowego interfejsu. W pierwszym przypadku stosuje się zwykle dziedziczenie wielokrotne. W tym drugim przypadku obiekt jest zawijany przez zgodny adapter i przekazywany dookoła. Problem, który tutaj rozwiązujemy, dotyczy niekompatybilnych interfejsów .

Fasada bardziej przypomina prostą bramę do skomplikowanego zestawu funkcji. Tworzysz czarną skrzynkę, aby Twoi klienci mogli się mniej martwić, tj. Uprościć interfejsy .

Proxy zapewnia ten sam interfejs, co klasa proxy-for i zazwyczaj wykonuje samodzielnie pewne czynności porządkowe. (Zamiast więc tworzyć wiele kopii ciężkiego obiektu, Xtworzysz kopie lekkiego proxy, Pktóre z kolei zarządza Xi tłumaczy twoje wywołania zgodnie z wymaganiami.) Rozwiązujesz problem klienta związany z koniecznością zarządzania ciężkim i / lub złożonym obiektem .

Dekorator służy do dodawania większej ilości prochu do twoich obiektów (zwróć uwagę na termin obiekty - zazwyczaj dekorujesz obiekty dynamicznie w czasie wykonywania). Nie ukrywasz / nie osłabiasz istniejących interfejsów obiektu, ale po prostu rozszerzasz go w czasie wykonywania .

Teraz, gdy masz już zaangażowany dekorator, prawdopodobnie będziesz chciał wiedzieć, dlaczego nacisk kładzie się na obiekt słowa - niektóre języki (takie jak Java) po prostu nie pozwalają na dziedziczenie wirtualne (tj. Wielokrotne dziedziczenie jak C ++), aby umożliwić Ci to w czas kompilacji.

Ponieważ przeciągnęliśmy wiele dziedziczenia (i przerażający diament), będziesz zwracać uwagę na mieszanki - które są uporządkowanymi liniowymi łańcuchami interfejsów, aby obejść problemy wielokrotnego dziedziczenia. Jednak miksy nie mieszają się tak dobrze. Kończymy z cechami - tak, te bezstanowe małe plamki zachowania , które pojawiają się cały czas w parametrach szablonu w C ++. Cechy próbują rozwiązywać problemy kompozycji i dekompozycji zachowania w elegancki sposób, nie idąc ani na wielokrotne dziedziczenie, ani na uporządkowane łańcuchy.

dirkgently
źródło
1
HTH! Próbowałem włożyć tyle, ile mogłem, nie będąc zbyt ogólnikowym. Przepraszam, że nie mogę zrobić nic lepszego. Przeczytałem prace (rozprawę doktorską) dotyczące samych cech. Moja wiedza jest więc raczej ograniczona i nie jestem na tyle dobry, aby zmieścić się we wszystkich wzorcach w tej przestrzeni;)
dirkgently
Przewidywałeś, że w przyszłości pojawi się pytanie dotyczące miksów i cech, ale jeszcze ich nie widziałem!
user310291
1
Dobry link porównawczy (przez wikipedię) dla pierwszych trzech (dekorator jest zupełnie inny): NetObjectives
Liviu
@Liviu Twój link nie działa. Zakładam, że pierwotnie wskazywałeś tam , ale teraz zawartość wydaje się być ukryta za logowaniem.
Jonathan H
@Sheljohn Link zaktualizowany: p: Dobry link do porównania (przez wikipedię) dla pierwszych trzech (dekorator jest całkiem inny) NetObjectives (Odzyskiwanie tekstu, zobacz „betweem”: „Jednym z częściej zadawanych pytań na zajęciach jest„ co to jest różnica między Adaptor, Proxy i Facade? Wydają mi się naprawdę takie same ”)
Liviu,
16

Fasada

Możesz na przykład użyć fasady, aby ułatwić wywoływanie API. Spójrz na ten przykład odległej fasady. Chodzi o to, że pełna implementacja kodu na serwerze jest ukryta przed klientem. Klient wywołuje 1 metodę API, która z kolei może wykonać 1 lub więcej wywołań API na serwerze.

Adapter

Dobry przykład tego można znaleźć tutaj , w Wikipedii. Obiekt klienta Sourcechciałby wywołać metodę na innym obiekcie Target, ale interfejs tego innego obiektu różni się od tego, czego oczekuje klient.

Wprowadź obiekt adaptera.

Może odebrać wywołanie z Sourceobiektu i za kulisami wywołać Targetmetodę, której należy użyć.

Source->CallMethodAOnTarget() ---< Adaptor.CallMethodAOnTarget() this calls ---> Target.MethodWithDifferentSignatureAndName(int i)

Jeśli chodzi o Proxy, nie mam żadnego doświadczenia z tym wzorcem projektowym.

Jason Evans
źródło