Wzorze.doc

(832 KB) Pobierz
Template – Umożliwia utworzenie schematu postępowania, wyszczególnienia kroków operacji, lecz już bez implementacji poszczególnych kroków

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

    {

        protected override void pobierzDane()

        {

            Random R = new Random();

            tab = new int[100];

            for (int j = 0; j < tab.Length; j++) tab[j] = R.Next(); // Inizjalizacja tablicy

        }

        protected override bool warunek(int a)

        {

            if (a > 100 && a%2==0) return true; // jeśli liczba większa od 100 i parzysta, to pasuje do wzorca

            else return false;

        }

        protected override void wyswietlWynik()

        {

            System.Console.Out.WriteLine(tab[i]);

        }

    }

 

 

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;

            int n = tab.Length;

 

            for (int i = 0; i < n; i++)

                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

    {

        public override double licz(double a, double b)

        {

            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.

...

Zgłoś jeśli naruszono regulamin