Jednym z ważniejszych wzorców projektowych jest niewątpliwie strategia. Jest to jeden z behawioralnych wzorców projektowych, czyli opisujący algorytmy i komunikację pomiędzy obiektami.
Strategy Pattern definiuje rodzinę powiązanych ze sobą algorytmów, które mogą być wymieniane ze sobą w zależności od wymagań klienta.
Diagram ogólny UML mógłby mieć następującą postać:
Jak widać klasa Klient zawiera w sobie referencję do interfejsu Strategy. Dzięki metodzie changeStrategy możemy zmienić zachowanie naszego obiektu.
Prosty przykład:
Wyobraźmy sobie, że mamy klasę KinoDomowe. Klasa ta może zawierać różne pola. Jednym z ważniejszych składników tworzących kino domowe jest dźwięk. Dźwięk może być kodowany w różnych formatach. Spójrzmy na diagram klas:
Dzięki wykorzystaniu wzorca Strategy jesteśmy w stanie w łatwy sposób zmieniać sposób kodowania dźwięku. Dlaczego taki sposób jest lepszy od np. dodania odpowiednich pól do klasy Kino Domowe i ustawianie ich wartości w zależności od tego jaki dźwięk jest aktualnie używany? Jeśli stworzylibyśmy większą hierarchię klas która mogłaby wyglądać np. tak:
W takim przypadku użycie naszego wzorca daje dużo większe pole do popisu. Jeśli korzystalibyśmy ze zwykłego dziedziczenia i polimorfizmu nie uzyskalibyśmy wystarczająco zadowalających efektów, które w łatwy sposób w przyszłości można by było modyfikować.
A teraz krótki kod do przykładu:
public abstract class KinoDomowe { private int przekatnaEkranu; private int mocNaglosnienia; private IKodowanieDzwieku kodowanieDzwieku; public KinoDomowe(int przekatnaEkranu, int mocNaglosnienia) { this.mocNaglosnienia = mocNaglosnienia; this.przekatnaEkranu = przekatnaEkranu; } public IKodowanieDzwieku KodowanieDzwieku { get { return kodowanieDzwieku; } set { kodowanieDzwieku = value; } } public override string ToString() { return string.Format(@"Kino domowe z ekranem o przekatnej {0}, mocy naglosnienia {1} oraz grajace w systemie {2}", przekatnaEkranu, mocNaglosnienia, kodowanieDzwieku.KodujDzwiek()); } } public interface IKodowanieDzwieku { string KodujDzwiek(); } public class LPCM : IKodowanieDzwieku { #region IKodowanieDzwieku Members public string KodujDzwiek() { return string.Format("LPCM"); } #endregion } public class DolbyProLogic : IKodowanieDzwieku { #region IKodowanieDzwieku Members public string KodujDzwiek() { return string.Format("DolbyProLogic"); } #endregion } public class DolbyDigital : IKodowanieDzwieku { #region IKodowanieDzwieku Members public string KodujDzwiek() { return string.Format("DolbyDigital"); } #endregion } static void Main(string[] args) { KinoDomowe kinoDomowe = new KinoDomowe(40, 200); kinoDomowe.KodowanieDzwieku = new LPCM(); Console.WriteLine(kinoDomowe.ToString()); Console.WriteLine("----------------------"); kinoDomowe.KodowanieDzwieku = new DolbyDigital(); Console.WriteLine(kinoDomowe.ToString()); }
Podsumowując: Wzorce projektowe przydają się i należy się ich uczyć. W wielu sytuacjach mogą nam oszczędzić czas i nerwy.
Brak komentarzy:
Prześlij komentarz