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