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.

- 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]); } }