Jak nauczyć się wzorca projektowania strategii? Zrób hamburgera!

Czy wiesz jak zamówić burgera?

Jeśli tak, mam dla ciebie dobrą wiadomość. Wtedy wiesz, jak korzystać z jednego z najczęściej używanych wzorców projektowych, wzorca strategii!

„Jak to możliwe?”, Możesz zapytać. Rzućmy okiem na cechy wzorca strategii.

  • Definiuje rodzinę algorytmów.
  • Zawiera każdy algorytm.
  • Dzięki temu algorytmy są wymienne w obrębie tej rodziny.

Wzorzec strategii pozwala algorytmowi zmieniać się niezależnie od klientów, którzy go używają.

Czy czujesz się tak zdezorientowany jak ten facet?

Jak to ma coś wspólnego z burgerami?

Pomyślmy przez chwilę o burgerach.

Istnieje wiele odmian burgerów: burger wegetariański, cheeseburger, grillowany kurczak burger i podwójny cheeseburger, żeby wymienić tylko kilka. Wszystkie mają ten sam format: górna bułka + pasztecik + dolna bułka.

To pasztecik sprawia, że ​​każdy burger jest inny. Cheeseburger ma na środku ser i placek wołowy, a burger z grilla ma placek z piersi z kurczaka.

Podsumujmy definicję wzorca strategii w kategoriach burgerów. Jaka jest rodzina algorytmów pod względem burgerów? To rodzina różnych pasztecików:

  • pasztecik do burgera z kurczaka = [grillowana pierś z kurczaka]
  • pasztecik na cheeseburgera = [ser + patty wołowe]
  • pasztecik za podwójnego cheeseburgera = [ser + placek wołowy + ser + placek wołowy]

Są hermetyzowane i wymienne. Wymień pasztet z burgera z kurczaka z pasztecikiem z cheeseburgera, a otrzymasz cheeseburgera.

Strategia pozwala algorytmowi zmieniać się niezależnie od klientów, którzy go używają.

Możesz zamówić dowolnego burgera, który ci się podoba. Ale dla szefa kuchni robienie burgera odbywa się według tej samej ogólnej procedury: przygotuj bułkę, ugotuj pasztecik, a następnie umieść pasztecik między górną a dolną bułką.

Hamburger to prawdziwy przykład użycia wzorca strategii.

Rzućmy okiem na kod.

Wzorzec strategii obejmuje trzech uczestników.

Strategia deklaruje interfejs wspólny dla wszystkich obsługiwanych algorytmów. Kontekst używa tego interfejsu do wywołania algorytmu określonego przez konkretną strategię.

Konkretna strategia implementuje algorytm za pomocą StrategyInterface.

Kontekst jest skonfigurowany za pomocą obiektu ConcreteStrategy; utrzymuje odniesienie do obiektu strategii; może zdefiniować interfejs, który umożliwia strategii dostęp do jej danych.

GrilledChickenStuffing i BeefPattyStuffing to nasze konkretne strategie. Każdy określa, w jaki sposób należy ugotować farsz. Klasa Burger jest naszym kontekstem. Jest skonfigurowany z konkretną strategią i korzysta z konkretnej strategii później, gdy trzeba ugotować burgera.

W naszym przykładzie burgera nie mamy konkretnej klasy, która deklaruje, jaki interfejs powinny zostać wdrożone konkretne strategie. To dlatego, że nie musimy, dzięki pisaniu kaczek Ruby. Jeśli chodzi jak kaczka i mówi jak kaczka, to jest kaczka. Jeśli można go ugotować jako burger, to jest to burger.

Strategia deklaruje interfejs, dla którego konkretna strategia powinna zostać wdrożona i dla którego kontekstu można użyć. Jak widać w powyższym kodzie, zarówno GrilledChickenStuffing, jak i BeefPattyStuffing implementują metodę cooka, i jest to metoda, którą użytkownik konkretnej strategii, czyli kontekstu, oczekuje od konkretnej strategii.

Kluczowa idea wzorca strategii

Kluczem do wzorca strategii jest wyciągnięcie różnych algorytmów do oddzielnego obiektu. Obiekty te stają się rodziną algorytmów, z których kontekst może wybierać. Każdy z tych obiektów, zwany także strategiami, wykonuje tę samą pracę i obsługuje ten sam interfejs.

W naszym przykładzie burgera mamy różne patty strategie dla burgera. I każda konkretna strategia pasztecika burgera obsługuje ten sam interfejs, wdrażając metodę gotowania.

Chodzi o kompozycję. Użytkownik ma strategię i deleguje. Użytkownik strategii deleguje zadanie. W naszym przykładzie burger ma pasztecik i deleguje zadanie gotowania.

Zalety wzorca strategii

  • Osiąga lepsze rozdzielenie obaw poprzez wyciągnięcie zestawu strategii z klasy i przerzuca klasę Burger jakiejkolwiek odpowiedzialności za naszą wiedzę o farszu.
  • Ułatwia to przełączanie strategii w czasie wykonywania, ponieważ wzorzec opiera się na kompozycji i delegowaniu, a nie na dziedziczeniu.

Rzeczy, na które należy uważać, rozważając zastosowanie wzorca strategii

  • Przekazywanie danych między kontekstem a strategią. Jeśli wdrożenie konkretnej strategii wymaga danych z kontekstu, możesz albo przekazać dane jako parametry do konkretnej strategii, albo sam kontekst do konkretnej strategii. Jest tak, aby konkretna strategia mogła mieć dostęp do danych w kontekście. Niezależnie od tego, który wybierzesz, uważaj na plątanie się kontekstu i konkretną strategię.
  • Sprawdź dokładnie, czy rzeczywiście potrzebujesz wzorca strategii, metody szablonu lub wzorca dekoratora.

Zasady projektowania stosowane we wzorze strategii

  • Obuduj to, co się różni
  • Preferuj kompozycję zamiast dziedziczenia
  • Program do interfejsów, a nie implementacja

Teraz poznałeś wzór strategii.

Oto ważne pytanie: jaka jest twoja ulubiona strategia burgerów? :)

Co tydzień publikuję na sihui.io.

Subskrybuj, aby nie przegapić następnego artykułu z serii.

Następnym razem przyjrzymy się metodzie szablonu i…