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?

Author: nbro, 2010-08-16

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.

 250
Author: dirkgently,
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)

Co do Proxy, to nie mam doświadczenia z tym wzorcem projektowym.
 15
Author: Jason Evans,
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