Patterns / Behavioral patterns
image

uses System.SysUtils;

type
  //the algorithm is swappable
  TSortStrategy = reference to procedure(
    var Items: TArray<Integer>);

procedure Ascending(
  var Items: TArray<Integer>);
var
  I, J, Tmp: Integer;
begin
  for I := High(Items) downto 1 do
    for J := 0 to I - 1 do
      if Items[J] > Items[J + 1then
      begin
        Tmp := Items[J];
        Items[J] := Items[J + 1];
        Items[J + 1] := Tmp;
      end;
end;

var
  Strategy: TSortStrategy;
  Items: TArray<Integer>;
  Number: Integer;
begin
  Items := [413];

  Strategy := Ascending;
  Strategy(Items);

  for Number in Items do
    Write(Number, ' ');
  WriteLn;
  //1 3 4
end.


Define a family of algorithms, encapsulate each one, and make them interchangeable. Strategy lets the algorithm vary independently from clients that use it.