Design Patterns
Example 1: Sorting Algorithms

using System;

// 1. Strategy Interface
public interface ISortStrategy
{
    void Sort(int[] data);
}

// 2. Concrete Strategies
public class QuickSortStrategy : ISortStrategy
{
    public void Sort(int[] data)
    {
        Array.Sort(data); // Example quicksort implementation
        Console.WriteLine("Sorted using QuickSort.");
    }
}

public class MergeSortStrategy : ISortStrategy
{
    public void Sort(int[] data)
    {
        Array.Sort(data); // Example mergesort implementation
        Console.WriteLine("Sorted using MergeSort.");
    }
}

// 3. Context
public class Sorter
{
    private ISortStrategy _strategy;

    public Sorter(ISortStrategy strategy)
    {
        _strategy = strategy;
    }

    public void SetStrategy(ISortStrategy strategy)
    {
        _strategy = strategy;
    }

    public void PerformSort(int[] data)
    {
        _strategy.Sort(data);
    }
}

// Client code
class Program
{
    static void Main()
    {
        int[] data = { 3, 1, 4, 1, 5, 9, 2, 6, 5, 3 };

        Sorter sorter = new Sorter(new QuickSortStrategy());
        sorter.PerformSort(data);
        Console.WriteLine("Sorted data: " + string.Join(", ", data));

        sorter.SetStrategy(new MergeSortStrategy());
        sorter.PerformSort(data);
        Console.WriteLine("Sorted data: " + string.Join(", ", data));
    }
}