Jaka jest różnica między wzorcami projektowymi Fasada, Proxy, Adapter i Dekorator?
Nigdy nie czytałem jasnego wyjaśnienia, jakie jest twoje?
Jaka jest różnica między wzorcami projektowymi Fasada, Proxy, Adapter i Dekorator?
Nigdy nie czytałem jasnego wyjaśnienia, jakie jest twoje?
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ądza X
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.
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 obiekcie Target
, 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.