@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.
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.
Odpowiedzi:
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,
X
tworzysz kopie lekkiego proxy,P
które z kolei zarządzaX
i 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.
źródło
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
Source
chciałby wywołać metodę na innym obiekcieTarget
, ale interfejs tego innego obiektu różni się od tego, czego oczekuje klient.Wprowadź obiekt adaptera.
Może odebrać wywołanie z
Source
obiektu i za kulisami wywołaćTarget
metodę, 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.
źródło