> ## Documentation Index
> Fetch the complete documentation index at: https://docs.baenninger.me/llms.txt
> Use this file to discover all available pages before exploring further.

# Strategy

Strategy ist ein verhaltensorientiertes Entwurfsmuster, mit dem du eine Familie von Algorithmen definierst, jeden von ihnen in einer eigenen Klasse unterbringst und ihre Objekte austauschbar machen kannst.

## Klassendiagramm

<Frame caption="Behavioral Patterns">
  <img src="https://mintcdn.com/levexis-38849a2b/Wa_zkryx5Qc1QyS0/images/content/dotnet/strategy-drawio.png?fit=max&auto=format&n=Wa_zkryx5Qc1QyS0&q=85&s=db7aa1983f44def3cedaaab4dd82ccdb" alt="Abbildung" width="681" height="264" data-path="images/content/dotnet/strategy-drawio.png" />
</Frame>

## Implementierung

<Tabs>
  <Tab title="Context">
    ```csharp title="Context.cs" theme={null}
    public class Context
    {
        private Strategy? _strategy;

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

        public void ExecuteStrategy()
        {
            _strategy?.Execute();
        }
    }
    ```
  </Tab>

  <Tab title="IStrategy">
    ```csharp title="IStrategy.cs" theme={null}
    public interface Strategy
    {
        void Execute();
    }
    ```
  </Tab>

  <Tab title="ConcreteStrategyA">
    ```csharp title="ConcreteStrategyA.cs" theme={null}
    public class ConcreteStrategyA : Strategy
    {
        public void Execute()
        {
            Console.WriteLine("Executing strategy A");
        }
    }
    ```
  </Tab>

  <Tab title="ConcreteStrategyB">
    ```csharp title="ConcreteStrategyB.cs" theme={null}
    public class ConcreteStrategyB : Strategy
    {
        public void Execute()
        {
            Console.WriteLine("Executing strategy B");
        }
    }
    ```
  </Tab>

  <Tab title="ConcreteStrategyC">
    ```csharp title="ConcreteStrategyC.cs" theme={null}
    public class ConcreteStrategyC : Strategy
    {
        public void Execute()
        {
            Console.WriteLine("Executing strategy C");
        }
    }
    ```
  </Tab>
</Tabs>

## Beispiel

### Klassendiagramm

<Frame caption="Behavioral Patterns">
  <img src="https://mintcdn.com/levexis-38849a2b/Wa_zkryx5Qc1QyS0/images/content/dotnet/class-diagram-5.png?fit=max&auto=format&n=Wa_zkryx5Qc1QyS0&q=85&s=49f039c3cbdbc958ae7b0760302f6ca8" alt="Abbildung" width="4203" height="1535" data-path="images/content/dotnet/class-diagram-5.png" />
</Frame>

### Implementierung

<Tabs>
  <Tab title="Context">
    ```csharp title="ShoppingCart.cs" theme={null}
    public class ShoppingCart
    {
        private IPaymentStrategy? _strategy;

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

        public void Checkout(decimal amount)
        {
            _strategy?.Pay(amount);
        }
    }
    ```
  </Tab>

  <Tab title="IStrategy">
    ```csharp title="IPaymentStrategy.cs" theme={null}
    public interface IPaymentStrategy
    {
        void Pay(decimal amount);
    }
    ```
  </Tab>

  <Tab title="ConcreteStrategyA">
    ```csharp title="CreditCardStrategy.cs" theme={null}
    public class CreditCardStrategy(
        string name,
        string cardNumber,
        string cvv,
        string dateOfExpiry) : IPaymentStrategy
    {
        private string _name = name;
        private string _cardNumber = cardNumber;
        private string _cvv = cvv;
        private string _dateOfExpiry = dateOfExpiry;

        public void Pay(decimal amount)
        {
            Console.WriteLine($"Paid {amount} using credit card");
        }
    }
    ```
  </Tab>

  <Tab title="ConcreteStrategyB">
    ```csharp title="BankTransferStrategy.cs" theme={null}
    public class BankTransferStrategy(string bankName, string accountNumber) : IPaymentStrategy
    {
        private readonly string _bankName = bankName;
        private readonly string _accountNumber = accountNumber;

        public void Pay(decimal amount)
        {
            Console.WriteLine($"Paid {amount} using Bank Transfer");
        }
    }
    ```
  </Tab>

  <Tab title="ConcreteStrategyC">
    ```csharp title="PayPalStrategy.cs" theme={null}
    public class PayPalStrategy(string email, string password) : IPaymentStrategy
    {
        private string _email = email;
        private string _password = password;

        public void Pay(decimal amount)
        {
            Console.WriteLine($"Paid {amount} using PayPal");
        }
    }
    ```
  </Tab>
</Tabs>
