Skip to content

Instantly share code, notes, and snippets.

@sunmeat
Last active January 23, 2026 10:13
Show Gist options
  • Select an option

  • Save sunmeat/386f621a86490f1b3abac6d66b38ac34 to your computer and use it in GitHub Desktop.

Select an option

Save sunmeat/386f621a86490f1b3abac6d66b38ac34 to your computer and use it in GitHub Desktop.
strategy pattern C# example
using System;
using System.Text;
namespace StrategyPatternDucks
{
// інтерфейси поведінки
internal interface IFlyBehavior
{
void Fly();
}
internal interface IQuackBehavior
{
void Quack();
}
// реалізації польоту
internal class FlyWithWings : IFlyBehavior
{
public void Fly() => Console.WriteLine("махає крилами!");
}
internal class Flightless : IFlyBehavior
{
public void Fly() => Console.WriteLine("я не вмію літати :(");
}
internal class JetPack : IFlyBehavior
{
public void Fly() => Console.WriteLine("використовує реактивний ранець!");
}
// реалізації крякання
internal class UsualQuack : IQuackBehavior
{
public void Quack() => Console.WriteLine("кря-кря!");
}
internal class Squeak : IQuackBehavior
{
public void Quack() => Console.WriteLine("пі-і-іп!");
}
internal class SilentSqueak : IQuackBehavior
{
public void Quack() => Console.WriteLine("*звук цвіркуна*");
}
// базовий абстрактний клас качок
internal abstract class Duck
{
protected IFlyBehavior? flyBehavior;
protected IQuackBehavior? quackBehavior;
public virtual void Swim() => Console.WriteLine("усі качки плавають!");
public abstract void Display();
public void PerformFly() => flyBehavior?.Fly();
public void PerformQuack() => quackBehavior?.Quack();
public void SetFlyBehavior(IFlyBehavior newFlyBehavior) => flyBehavior = newFlyBehavior;
public void SetQuackBehavior(IQuackBehavior newQuackBehavior) => quackBehavior = newQuackBehavior;
}
// конкретні качки
internal class MallardDuck : Duck
{
public MallardDuck()
{
flyBehavior = new FlyWithWings();
quackBehavior = new UsualQuack();
}
public override void Display() => Console.WriteLine("крижнева_качка.jpg");
}
internal class RubberDuck : Duck
{
public RubberDuck()
{
flyBehavior = new Flightless();
quackBehavior = new Squeak();
}
public override void Display() => Console.WriteLine("гумова_качка.jpg");
}
internal class DecoyDuck : Duck // дерев'яна качка-принада
{
public DecoyDuck()
{
flyBehavior = new Flightless();
quackBehavior = new SilentSqueak();
}
public override void Display() => Console.WriteLine("качка-принада.jpg");
}
internal static class Program
{
private static void Main()
{
Console.OutputEncoding = Encoding.UTF8;
Console.WriteLine("Рішення №2 — патерн Стратегія\n");
Duck duck = new MallardDuck();
duck.Display();
duck.PerformFly();
duck.PerformQuack();
duck.Swim();
Console.WriteLine();
duck = new RubberDuck();
duck.Display();
duck.PerformFly();
duck.PerformQuack();
duck.Swim();
Console.WriteLine();
duck = new DecoyDuck();
duck.Display();
duck.PerformFly();
duck.PerformQuack();
duck.Swim();
Console.WriteLine();
// качка-принада раптом отримує реактивний ранець!
Console.WriteLine("А тепер — магія зміни поведінки на льоту:");
duck.SetFlyBehavior(new JetPack());
duck.SetQuackBehavior(new Squeak());
duck.PerformFly();
duck.PerformQuack();
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment