Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?
Autor: Piotr Szawdyński
Wzorce projektowe

strategia

[wzorzec projektowy] Umożliwia zmianę algorytmu w trakcie życia programu.

Budowa wzorca projektowego

C/C++
class IAlgorithm
{
public:
    virtual void metoda1() = 0;
    virtual void metoda2( int argument ) = 0;
    virtual int metoda3( double argument ) = 0;
};

class CObject_Algorithm1
    : public IAlgorithm
{
    //pełna implementacja interfejsu
};

class CObject_Algorithm2
    : public IAlgorithm
{
    //pełna implementacja interfejsu
};

class CObject_Algorithm3
    : public IAlgorithm
{
    //pełna implementacja interfejsu
};

class CObject
{
private:
    IAlgorithm * m_pAlgorithm;
public:
    void ustaw_algorytm( IAlgorithm * pAlgorithm );
    void zadanie();
};

Opis szczegółowy

Strategia (ang. Strategy) - wzorzec projektowy dzięki któremu możliwa jest zmiana algorytmu w trakcie życia programu. Niniejszy wzorzec może być wykorzystywany do takich rzeczy jak np. walidacja formularzy, filtrowanie danych czy też sortowanie danych.

Wzorzec projektowy strategy stosuje się gdy jesteśmy w stanie wyłonić grupę algorytmów powiązanych ze sobą. Zastosowanie niniejszego wzorca zapewnia możliwość łatwej rozbudowy aplikacji o nowe algorytmy bez konieczności zmiany jego architektury.

Dodatkowe informacje

» Wzorce projektowe » Wzorce czynnościowestan wzorzec projektowy jest wzorcem projektowym o takiej samej konstrukcji jak strategy. Istnieje jednak między nimi istotna różnica w zasadzie działania. Wzorzec projektowy strategy powinien posiadać następującą własność: algorytm obiektu nie może być zmieniany automatycznie np. w zależności od wartości zmiennych. Onacza to, że algorytm musi być zmieniany spoza klasy.

Przykład

C/C++
#include <cstdio>
#include <vector>

class IFiltr
{
public:
    virtual bool sprawdz( int iLiczba ) = 0;
}; //class IFiltr

class CParzyste
    : public IFiltr
{
    CParzyste() { };
public:
    virtual bool sprawdz( int iLiczba )
    {
        return iLiczba % 2 == 0;
    }
   
    static IFiltr * getSingleton()
    {
        static CParzyste singleton;
        return & singleton;
    }
   
}; //class CParzyste

class CNieparzyste
    : public IFiltr
{
    CNieparzyste() { };
public:
    virtual bool sprawdz( int iLiczba )
    {
        return iLiczba % 2 != 0;
    }
   
    static IFiltr * getSingleton()
    {
        static CNieparzyste singleton;
        return & singleton;
    }
}; //class CNieparzyste

class CLiczby
{
    typedef std::vector < int > LiczbyT;
    LiczbyT m_vLiczby;
    IFiltr * m_pFiltr;
public:
    CLiczby()
        : m_pFiltr( NULL )
    {
    }
   
    void push_back( int iLiczba )
    {
        m_vLiczby.push_back( iLiczba );
    }
   
    void ustawFiltr( IFiltr * pFiltr )
    {
        m_pFiltr = pFiltr;
    }
   
    void wypisz()
    {
        for( LiczbyT::const_iterator i = m_vLiczby.begin(); i != m_vLiczby.end(); i++ )
        if( !m_pFiltr || m_pFiltr->sprawdz( * i ) )
             printf( "%d ", * i );
       
        printf( "\n" );
    }
   
}; //class CLiczby

int main()
{
    CLiczby liczby;
    for( int i = 0; i < 10; i++ )
         liczby.push_back( i );
   
    liczby.wypisz();
    liczby.ustawFiltr( CParzyste::getSingleton() );
    liczby.wypisz();
    liczby.ustawFiltr( CNieparzyste::getSingleton() );
    liczby.wypisz();
    liczby.ustawFiltr( NULL );
    liczby.wypisz();
    return 0;
}
Standardowe wyjście programu:
0 1 2 3 4 5 6 7 8 9
0 2 4 6 8
1 3 5 7 9
0 1 2 3 4 5 6 7 8 9