Software.com.pl
September 7, 2010, 9:41 pm

Strategy

1 Gwiazdka2 Gwiazdki3 Gwiazdki4 Gwiazdki5 Gwiazdek (7 głosów, średnia: 3,86 / 5)

Strategy jest wzorcem projektowym. Na początek jednak parę słów wyjaśnienia, dla osób które z wzorcami nie miały jeszcze do czynienia.
Autor: Rafał Kański
Źródłó: http://blogophp.com/2008/12/02/strategy/

definicja
Wzorzec projektowy to pewnego rodzaju sprawdzony i uniwersalny sposób na rozwiązanie konkretnego problemu programisty z wykorzystaniem możliwości, jakie daje nam OOP. Stosowanie design patterns sprawia, że tworzony przez nas kod jest zdecydowanie bardziej czytelny i niezawodny. W razie rozbudowy funkcjonalności naszej aplikacji, proces ten przebiega znacznie szybciej. Wzorce projektowe pozwalają na lepszą komunikację programistów, w przypadku pracy grupowej. Spytacie dlaczego? Podam prosty przykład. Wyobraźcie sobie taką sytuację. Jesteście w pizzerii. Co jest szybsze podczas składania zamówienia: podawanie wszystkich składników danej pizzy czy wyłącznie jej nazwy? Wybierając drugie rozwiązanie zaoszczędzamy sporo czasu! Po co więc
opisywad kolegom jak zaimplementujemy jakąś klasę (co i jak będzie działad), jak wystarczy podad im nazwę konkretnego wzorca! Również analiza kodu pisanego przez innego programistę z wykorzystaniem design patterns trwa znacznie krócej!
Wzorce dzielimy na:

  • konstrukcyjne (tworzenie obiektów klas)
  • strukturalne (łączenie obiektów klas)
  • behawioralne (zwiększanie elastyczności i przepływu danych w naszych aplikacji)

Strategy należy do ostatniej grupy.

poznajemy strategię
Wzorzec ten znajduje zastosowanie tam, gdzie daną czynnośd możemy wykonad na wiele sposobów. Zapis obrazka w rozmaitych formatach (GIF, PNG,itp.) czy też wyświetlania danych na wyjściu jako RSS,XML (i podobne) stanowią doskonałe przykłady.

Aby lepiej zrozumied to co właśnie napisałem użyjemy strategy w praktyce. Załóżmy, że jesteśmy właścicielami sklepu internetowego. Korzystają z niego ludzie z całej Unii Europejskiej. Chcielibyśmy wprowadzid rabaty dla każdego zamówienia, w zależności od kraju z którego pochodzid będzie osoba zamawiająca. Na początku definiujemy sobie interfejs z prototypem funkcji, która będzie zwracad wysokośd rabatu.

interface discountInterface {
public function Discount ();
}

Kolejną rzeczą jest stworzenie klas implementujących powyższy interfejs. Każda klasa reprezentuje zniżkę w konkretnym kraju Unii.

class DiscountPL implements discountInterface {
public function Discount () {
return 10;
}
}
class DiscountEN implements discountInterface {
public function Discount () {
return 20;
}
}
class DiscountDE implements discountInterface {
public function Discount () {
return 15;
}
}
class NoDiscount implements discountInterface {
public function Discount () {
return 0;
}
}

Na koniec do klasy zamówienia dodaje możliwośd nakładania upustów.

//mocno uproszczono aby dobrze zrozumieć wzorzec!
class Order {
private $strategy;
public function __construct () {
$this->strategy = new NoDiscount ();
}
public function GetDiscount () {
return $this->strategy->Discount();
}
public function SetDiscount (discountInterface $obj) {
$this->strategy = $obj;
}
}

Jak wygodne jest to rozwiązanie? Bardzo! Od teraz dodanie nowego kraju (z innym rabatem) nie wymaga od nas ingerencji w kod klasy Order! Wystarczy skorzystad z metody SetDiscount, zwanej fachowo setterem behawioralnym.

$new_order = new Order ();
echo $new_order->GetDiscount();

//ustawiamy znizke!
//behavior setter method
$new_order->SetDiscount(new DiscountEN());

echo $new_order->GetDiscount();

Czy to aby na pewno wzorzec strategy? Tak! Konkretna czynnośd „nakładanie rabatu” wykonywana jest na wiele różnych sposobów (w zależności od paostwa Unii).
Mam nadzieję, że chod w małym stopniu zachęciłem Was do poznawania wzorców projektowych.

Podziel się na:
  • Wykop
  • Digg
  • Facebook
  • Google Bookmarks
  • Śledzik
  • Gadu-Gadu Live
  • Blip
  • Grono.net
  • PDF
  • Print
  • RSS

Wpisy autorstwa monika.

Zostaw odpowiedź

Comment moderation is enabled. Your comment may take some time to appear.