Wzorce projektowe: Pełnomocnik(Proxy)

Wzorzec Pełnomocnik(Proxy), jest dosyć podobny do wzorca Most(Bridge), jednak cel Pełnomocnika jest inny, jego celem jest utworzenie obiektu, który będzie reprezentował inny obiekt, to tak w dużym skrócie dokładniej o tym wzorcu dalej. Postaram się od dzisiaj prezentować większość przykładów w paru językach m.i.n w C++, Javie, C# oraz pythonie, do wszystkich będzie link do githuba na końcu wpisu.

 

Cel

  • Kontroluje dostęp do klas i jej obiektów, pośrednio poprzez inną klasę i obiekty.
  • Tworzy opakowanie dla klas, żeby je chronić przez nadmiernym skomplikowaniem.
  • Tworzy obiekty(zwykle te które zżerają dużo zasobów procesora) wtedy kiedy są one naprawdę potrzebne.

 

Problem

Potrzebujesz utworzyć pare zasobożernych🍔 obiektów jednak nie chcesz tworzyć odrazu ich instancji. Tutaj przyda się pełnomocnik.

Lub inny przykład, chcesz utworzyć jakąś klasę jednak musi być oną dobrze zahermetyzowana🎁 i kontrolowana✋, taka klasa może np reprezentować system robienia przelewów w systemie bankowym.

 

Użyj wtedy kiedy:

  • Chcesz utworzyć obiekt, który jest kosztowny💲 w utworzeniu, wtedy użyj wirtualnego pełnomocnika, który utworzy obiekt na żądanie.
  • Chcesz żeby był ograniczony dostęp do obiektu np na hasło
  • Chcesz utworzyć obiekt, który będzie reprezentował obiekty w innej przestrzeni adresowej np może to być klasa pełnomocnika, która wykorzystuje do działania dane przechowywane na innym serwerze.

 

Struktura

Poniżej diagram UML wzorca pełnomocnik, widać na nim, że dopiero w klasie pełnomocnika tworzymy prawdziwy obiekt.

 

Przykład

Poniżej jest schemat wzorca pełnomocnik w kodzie, jak on mniej więcej wygląda:

Gdy uruchomimy ten program, to musimy wpisać w konsoli poprawne hasło, w tym wypadku jest nim root, jeśli je wpiszemy to tworzymy obiekt klasy, w tym wzorcu tworzymy obiekt wtedy kiedy go potrzebujemy, więc nie robimy tego przez Dependency Injection, ale utworzyliśmy do tego specjalną metodę, która ten obiekt tworzy, wtedy kiedy wpiszemy poprawne hasło, można utworzyć fabrykę w tym wzorcu żeby instancje klas były dobrze zahermetyzowane jednak w tym prostym przykładzie nie będziemy się z tym bawić.

Wynik:

 

Przykład z życia wzięty

Zrobimy przykład na zasadzie robienia przelewów w systemie bankowym, na podstawie karty bankowej z banku można wypłacać pieniądze i dzięki niej możemy kontrolować ile mamy pieniędzy w banku, ile chcemy sobie wypłacić itd. Dobrze pokazuje to poniższy obrazek:

Zobaczmy jak to wygląda w kodzie:

Dosyć długi ten przykład wyszedł, ale myślę że, dobrze pokazuje działanie pełnomocnika.

Przypisałem 10000 USD do naszego konta🙂(szkoda, że to tylko fejkowe pieniądze😢😢)

Jak widać najpierw klient wprowadza pin i następnie klasa pełnomocnika sprawdza czy jest on poprawny ✅, jeśli tak to otwiera dostęp do konta, w naszym przykładzie przejawia się to w postaci utworzenia obiektu klasy BankAccount za pomocą wzorca fabryki.

I ustawiamy wartości prawda, fałsz w zależności od tego czy pin jest poprawny. I na koniec w kliencie jeśli pin jest poprawny  to wywołujemy metody klasy BankAccount, jeśli nie ❌ to tylko wyświetlamy odpowiedni komunikat.

Wynik:

 

Podobieństwa do innych wzorców

  • Adapter zapewnia inny interfejs dla obiektu. Proxy zapewnia ten sam interfejs. Dekorator zapewnia rozszerzony interfejs.
  • Dekoratorproxy mają różne cele, ale podobne struktury. Oba opisują sposób zapewnienia poziomu pośredniego do innego obiektu, a implementacje zachowują odniesienie do obiektu, do którego przesyłają żądania.

 

Podsumowanie

Hyc 😉

Link do githuba: https://github.com/Slaw145/ProxyTutorial

Tak jak mówiłem są tam, wszystkie przykłady z tego artykułu w czterech językach.

To tyle, jeśli chodzi o pełnomocnika🙂, przypominam o newsletterze, zapisz się jeśli nie chcesz przegapić kolejnych wpisów📄, oraz o stronie devmangrupie na facebooku gdzie można porozmawiać z innymi programistami.

Do zobaczenia 🙂

 
Jeśli ten wpis ci się przydał podziel się nim ze swoimi znajomymi :)

2
Post a comment

avatar
1 Comment threads
1 Thread replies
0 Followers
 
Most reacted comment
Hottest comment thread
2 Comment authors
SławekLukasz Recent comment authors
  Subscribe  
newest oldest evaluated
Notify about
Lukasz
Guest
Lukasz

Źle się ogląda kod z telefonu. Za duża mam czcionkę … 🙂

P.s czy na prawdę do komentowania musimy podawać email? Wrrrr