Template – Umożliwia utworzenie schematu postępowania, wyszczególnienia kroków operacji, lecz już bez implementacji poszczególnych kroków.
Implementacja wzorca template: należy utworzyć klasę abstrakcyjną, napisać w niej metodą finalną odwołującą się do metod abstrakcyjnych. Metody abstrakcyjne nadpisują klasy pochodne, które to juz dokładnie definiują poszczególne kroki algorytmu.
abstract class Przeszukiwanie
{
protected int[] tab;
protected int i = 0;
public void przeszukuj()
pobierzDane();
for (i = 0; i<tab.Length; i++)
if (warunek(tab[i])) wyswietlWynik();
}
abstract protected void pobierzDane();
abstract protected bool warunek(int a);
abstract protected void wyswietlWynik();
class Szukaj1 : Przeszukiwanie
protected override void pobierzDane()
tab = new int[100];
for (int j = 0; j < tab.Length; j++) tab[j] = j; // Inizjalizacja tablicy
protected override bool warunek(int a)
if (a % 3 == 0) return true; // jeśli liczba jest podizlena przez 3, to pasuje do wzorca
else return false;
protected override void wyswietlWynik()
System.Console.Out.WriteLine(tab[i]);
class Szukaj2 : Przeszukiwanie
Random R = new Random();
for (int j = 0; j < tab.Length; j++) tab[j] = R.Next(); // Inizjalizacja tablicy
if (a > 100 && a%2==0) return true; // jeśli liczba większa od 100 i parzysta, to pasuje do wzorca
Strategy – Pozwala ujednolicić sposób korzystania z rodziny podobnych algorytmów.
Implementacja polega na stworzeniu klasy abstrakcyjnej mówiącej jak daną metodę należy wywołać, oraz klas po niej dziedziczących, które implementują poszczególne wersje metod. Ważny też jest kontekst, w którym to następuje wybór z której implementacji algorytmu będzie się korzystać.
abstract class Srednia
public abstract double licz(double [] tab); // Sposób liczenia średniej
class Arytmetyczna : Srednia
public override double licz(double[] tab) // Implementacja konkretnej metody
double suma=0.0;
int n = tab.Length;
for (int i = 0; i < n; i++)
suma += tab[i];
return suma/n;
class Geometryczna : Srednia
public override double licz(double[] tab) / Implementacja konkretnej metody
double iloczyn = 1.0;
iloczyn *= tab[i];
return Math.Pow(iloczyn, 1.0 / n);
class Program
static void Main(string[] args)
double[] T = { 1.0, 2.5, 3.6, 2.8 };
Srednia Sa = new Arytmetyczna(); //Pierwszy sposób liczenia średniej
Console.Out.WriteLine(Sa.licz(T));
Srednia Sg = new Geometryczna(); // Drugi sposób
Console.Out.WriteLine(Sg.licz(T)); // Samo użycie funkcji dokłądnie takie samo
Console.ReadKey();
State – Wzorzec, w którym zachowanie obiektu zależy od rodzaju stanu w jakim się znajduje. Implementacja polega na utworzeniu klasy abstrakcyjnej stanu, oraz klas dziedziczących, które mogą implementować różne zachowania. Kontekst musi wówczas posiadać metodę zmiany stanu. Zaletą tego wzorca jest często znaczne uproszczenie kodu, nie trzeba dla każdego stanu pisać osobnej instrukcji warunkowej.
class Kalkulator
Stan S = new Dodawanie();
public void zmienStan(Stan Nowy)
S = Nowy; // Zmiana stanu na nowy - nie ma mozliwości przypisania stanu nieprawidłwoego, gdyż każdy obiekt dziedizczący po klasie Stan jest prawidłowym stanem
public void licz(double a, double b)
Console.Out.WriteLine(S.licz(a,b)); // Wysweitlony wynik zależy od stanu kalkulatora
abstract class Stan
public abstract double licz(double a, double b);
class Dodawanie : Stan
public override double licz(double a, double b)
return a + b;
class Potegowanie : Stan
return Math.Pow(a, b);
Nazwa
Zalety
Zastosowanie
Template
Nie ma potrzeby pisania wielu podobnych algorytmów od nowa, wystarczy napisać tylko różnice miedzy nimi.
Stosowane gdy jest znany jeden ogólny algorytm wykonania pewnej operacji, lecz wykonanie poszczególnych kroków zależy od sytuacji.
Strategy
Ułatwia wielokrotne wykorzystywanie tego samego fragmentu kodu.
Stosowane w celu ujednolicenia sposobu korzystania z rodziny podobnych metod.
State
Upraszcza kod, zapewnia, że nie będą występować stany nieprawidłowe.
Stosowane gdy trzeba rozróżnić różne stany obiektu oraz jego różne zachowania zależnie od stanu. State, pomimo, że podobne do strategy, powinno być stosowane tam, gdzie obiekt często zmienia swoje stany w czasie działania programu.
...
jarlfenrir