Wzorce projektowe
strategia
[wzorzec projektowy] Umożliwia zmianę algorytmu w trakcie życia programu.Budowa wzorca projektowego
class IAlgorithm
{
public:
virtual void metoda1() = 0;
virtual void metoda2( int argument ) = 0;
virtual int metoda3( double argument ) = 0;
};
class CObject_Algorithm1
: public IAlgorithm
{
};
class CObject_Algorithm2
: public IAlgorithm
{
};
class CObject_Algorithm3
: public IAlgorithm
{
};
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
stan 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
#include <cstdio>
#include <vector>
class IFiltr
{
public:
virtual bool sprawdz( int iLiczba ) = 0;
};
class CParzyste
: public IFiltr
{
CParzyste() { };
public:
virtual bool sprawdz( int iLiczba )
{
return iLiczba % 2 == 0;
}
static IFiltr * getSingleton()
{
static CParzyste singleton;
return & singleton;
}
};
class CNieparzyste
: public IFiltr
{
CNieparzyste() { };
public:
virtual bool sprawdz( int iLiczba )
{
return iLiczba % 2 != 0;
}
static IFiltr * getSingleton()
{
static CNieparzyste singleton;
return & singleton;
}
};
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" );
}
};
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
Wszystkie teksty są chronione prawami autorskimi. Kopiowanie lub rozpowszechnianie treści poza niniejszym serwisem
jest zabronione.
Powyższe ograniczenie nie dotyczy autora opracowania, któremu przysługuje prawo do rozpowszechniania własnego tekstu wedle własnego uznania.