Last active
January 23, 2026 10:13
-
-
Save sunmeat/386f621a86490f1b3abac6d66b38ac34 to your computer and use it in GitHub Desktop.
strategy pattern C# example
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| 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