We wzorcu Strategia definiujemy wspólny interfejs dla wszystkich obsługiwanych algorytmów (konkretnych strategii). Następnie implementujemy "kontekst" (sposób działania) i przekazujemy do niego wspólny interfejs.
Zalety:
- nie ma sztywnego powiązania między algorytmem a "kontekstem" - wykorzystywana kompozycja
- łatwa podmiana implementacji przez dodanie kolejnej nowej strategii implementującej interfejs
- eliminacja instrukcji warunkowych
public class BubbleSorter
{
private int operations = 0;
private int length = 0;
private SortHandler itsSortHandler = null;
public BubbleSorter(SortHandler handler) {
itsSortHandler = handler;
}
public int Sort(object array) {
itsSortHandler.SetArray(array);
length = itsSortHandler.Length();
operations = 0;
if (length <= 1)
return operations;
for (int nextToLast = length - 2;
nextToLast >= 0; nextToLast--)
for (int index = 0; index <= nextToLast; index++)
{
if (itsSortHandler.OutOfOrder(index))
itsSortHandler.Swap(index);
operations++;
}
return operations;
}
}
public interface SortHandler
{
void Swap(int index);
bool OutOfOrder(int index);
int Length();
void SetArray(object array);
}
public class IntSortHandler : SortHandler
{
private int[] array = null;
public void Swap(int index)
{
int temp = array[index];
array[index] = array[index + 1];
array[index + 1] = temp;
}
public void SetArray(object array) {
this.array = (int[]) array;
}
public int Length() {
return array.Length;
}
public bool OutOfOrder(int index) {
return (array[index] > array[index + 1]);
}
}