Friday, January 17, 2014

Șablon arhitectural - Strategy

Șablonul arhitectural Strategy este un șablon de tip "behavioral"(comportamental) ce a fost conceput pentru a defini o familie de algoritmi ce sunt încapsulați de către o clasă de tip "interfață". Scopul acestui șablon este de a selecta algoritmul optim pentru necesitatea fiecărui client, în funcție de specificațiile acestuia. De exemplu, avem de sortat un vector de numere. Pentru aceasta putem folosi algoritmi ca: Bubble Sort, Merge Sort sau Quick Sort etc. Șablonul Strategy oferă clientului posibilitatea de a alege singur ce algoritm poate folosi pentru a sorta vectorul sau. Pentru o privire de ansamblu cât mai clară urmăriți imaginea de mai jos.

După cum se vede în exemplu de mai sus, avem o clasă MyClass care are o metodă ce sortează un vector. Alături, avem o altă clasă de tip interfață ce conține o metodă sort(); care va fi suprascrisă mai târziu de către cele 3 clase ce implementează această interfață. Astfel în proiectul nostru avem o clasă ce conține modalități de sortare separate de obiectul de sortat, evitând astfel duplicarea codului în cazul în care dorim să mai folosim una dintre metodele de sortare în altă situație.

Acest șablon este folosit deseori în situații ca
  • atunci când putem folosi mai mulți algoritmi pentru o operație (vezi cazul de mai sus).
  • atunci când într-o clasă sunt definite mai multe comportamente (switch statements), Strategy oferă posibilitatea de a restrânge acele instrucțiuni de control prin implementarea sa.
  • atunci când dorim să evităm duplicarea codului.

Mai jos aveți un exemplu de implementare a acestui șablon (mai precis cum funcționează acest șablon la nivel de cod).


#include 
using namespace std;

class SortAlg{
public:
 SortAlg();
 ~SortAlg();
 virtual void sort();
};

class MergeSort : public SortAlg{
public:
 MergeSort();
 ~MergeSort();
 void sort();
};

void MergeSort::sort(){
 ...
 // se implementeaza functia pentru merge sort;
 ...
}

class QuickSort : public SortAlg{
public:
 QuickSort();
 ~QuickSort();
 void sort();
};

void QuickSort::sort(){
 ...
 // se implementeaza functia pentru quick sort;
 ...
}

class BubbleSort : public SortAlg{
public:
 BubbleSort();
 ~BubbleSort();
 void sort();
};

void BubbleSort::sort(){
 ...
 // se implementeaza functia pentru bubble sort
 ...
}

class MyClass{
public:
 MyClass();
 ~MyClass();
 void sortArray(int);
private:
 SortAlg *sortAlg;
 int *array;
};

void MyClass::sortArray(int x){
 ...
 // in loc de a avea un switch in functie de care se alegea
 // variata de sortare pentru array-ul nostru,
 // acum avem doar o singura instructiune de folosit
 this->sortAlg->sort();
 ...
}

No comments:

Post a Comment