Różnica między wzorcem adaptera a wzorcem proxy?

33

O ile rozumiem, wzorzec adaptera tworzy obiekt otoki dla naszego rzeczywistego obiektu będącego przedmiotem zainteresowania, po prostu jeszcze jeden poziom pośredni, który zapewnia elastyczność. elastyczność polega na tym, że jeśli interfejs rzeczywistego obiektu zostanie zmieniony, wówczas zmieniamy interfejs opakowania wskazujący na rzeczywisty obiekt, pozostawiając interfejs po stronie klienta niezmieniony.

Wzór proxy to samo, z tą różnicą, że każdy wrapper proxy tylko zapewnia spójny podzbiór funkcjonalności realnego obiektu. Dlaczego miałoby to być przydatne, skoro staramy się, aby „jedna klasa dla jednego celu” było poza mną.

Czy dostałem to poprawnie?

Vorac
źródło

Odpowiedzi:

55

Nie do końca.

Podstawowym celem wzorca adaptera jest zmiana interfejsu klasy / biblioteki A na oczekiwania klienta B. Typową implementacją jest klasa opakowania lub zestaw klas. Celem nie jest ułatwienie przyszłych zmian interfejsu, ale bieżące niezgodności interfejsu.

Wzór proxy wykorzystuje również otoki klas, ale w innym celu. Wzorzec proxy ma na celu utworzenie stand-in dla prawdziwych zasobów. Przyczyny korzystania z proxy mogą być

  • Prawdziwy zasób znajduje się na komputerze zdalnym (serwer proxy ułatwia interakcję z zasobem zdalnym)
  • Tworzenie prawdziwych zasobów jest kosztowne (proxy zapewnia, że ​​koszty nie zostaną poniesione, chyba że / do momentu, gdy będą naprawdę potrzebne)

Najważniejszą rzeczą jest to, że serwer proxy zastępuje rzeczywisty zasób, dla którego jest to stand-in, więc musi zapewniać ten sam interfejs.

Bart van Ingen Schenau
źródło
Przede wszystkim dzięki za świetną odpowiedź. Czy serwer proxy implementuje wszystkie interfejsy, których potrzebuje obecny klient, czy też implementuje wszystkie interfejsy zapewniane przez rzeczywiste zasoby?
Vorac,
1
@Vorac: To zależy od złożoności interfejsu i twojej filozofii projektowania. Oba są możliwe, ale jeśli interfejs jest duży / złożony lub mocno wierzysz w YAGNI, wtedy sensowniej jest wdrożyć tylko to, czego potrzebujesz.
Bart van Ingen Schenau
Biorąc pod uwagę, że wzorzec adaptera korzysta z klas opakowań, to czy wzorzec adaptera jest wzorcem proxy?
moonman239,
@ moonman239: Nie, ponieważ zamiar użycia klasy opakowania jest inny. To, że dwa wzorce wyglądają podobnie na diagramie klas, nie oznacza, że ​​są ze sobą powiązane lub się nawzajem implementują. Głównym czynnikiem różnicującym wzorce jest ich zamiar.
Bart van Ingen Schenau,