Różnica między wzorami projektowymi fasady, Proxy, adaptera i dekoratora? [zamknięte]
Jaka jest różnica między wzorami projektowymi fasady, Proxy, adaptera i dekoratora?
Nigdy nie czytałem jasnego wyjaśnienia, jakie jest twoje?
2 answers
Adapter dostosowuje daną klasę / obiekt do nowego interfejsu. W przypadku pierwszego dziedziczenia zazwyczaj stosuje się dziedziczenie wielokrotne. W tym drugim przypadku obiekt jest owinięty przez zgodny obiekt adaptera i przekazywany dookoła. Problem, który tutaj rozwiązujemy, to problem nie kompatybilnych interfejsów .
Fasada jest bardziej jak prosta brama do skomplikowanego zestawu funkcjonalności. Robisz czarną skrzynkę, aby Twoi klienci mniej się martwili, tzn. twórz interfejsy prostsze .
Proxy zapewnia ten sam interfejs co Klasa proxied-for i zazwyczaj robi pewne rzeczy porządkowe samodzielnie. (Więc zamiast tworzyć wiele kopii ciężkiego obiektu X
, tworzysz kopie lekkiego proxy P
, który z kolei zarządza X
i tłumaczy Twoje połączenia zgodnie z wymaganiami.) Rozwiązujesz problem klienta 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 twojego obiekty (zwróć uwagę na termin obiekty - zazwyczaj dekorujesz obiekty dynamicznie w czasie wykonywania). Nie ukrywasz/nie ograniczasz istniejących interfejsów obiektu, ale po prostu rozszerz go w czasie wykonywania.
Teraz, gdy masz dekorator zaangażowany, prawdopodobnie będziesz chciał wiedzieć, dlaczego nacisk na obiekt słowa -- Niektóre języki (jak Java) po prostu nie pozwalają na wirtualne dziedziczenie (tj. wielokrotne dziedziczenie jak C++), aby umożliwić Ci osiągnięcie tego w czasie kompilacji.
Ponieważ mamy przeciągnięty w wielu dziedziczeniach (i przerażający diament) zwróć uwagę na mixiny -- które są uporządkowanym liniowym łańcuchem interfejsów, aby ominąć problemy wielokrotnego dziedziczenia. Jednak mieszanki nie mieszają się tak dobrze. I kończymy z cechami -- tak te bezpaństwowe małe plamki zachowania, które widzisz cały czas w parametrach szablonu w C++. Cechy starają się rozwiązać problemy składu i rozkładu zachowania w eleganckim sposób, nie przechodząc ani do wielu dziedziczeń, ani do uporządkowanego łączenia.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-04-30 10:37:05
Fasada
Możesz użyć fasady, na przykład, aby ułatwić wywołanie API. Spójrz na Ten przykład odległej fasady. Chodzi o to, że pełna implementacja kodu na serwerze jest ukryta z dala od klienta. 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 , na Wikipedii. Obiekt klienta Source
chciałby wywołanie metody na innym obiekcie Target
, ale interfejs tego innego obiektu różni się od tego, czego oczekuje klient.
Wprowadź obiekt adaptera.
Może odbierać wywołanie z obiektu Source
i, za kulisami, wywoływać metodę Target
, która powinna być użyta.
Source->CallMethodAOnTarget() ---< Adaptor.CallMethodAOnTarget() this calls ---> Target.MethodWithDifferentSignatureAndName(int i)
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-09-27 14:36:23