Skip to content

Instantly share code, notes, and snippets.

@sunmeat
Created May 27, 2024 09:21
Show Gist options
  • Save sunmeat/386f621a86490f1b3abac6d66b38ac34 to your computer and use it in GitHub Desktop.
Save sunmeat/386f621a86490f1b3abac6d66b38ac34 to your computer and use it in GitHub Desktop.
strategy pattern C# example
// интерфейсы, описывающие абстрактное поведение
interface FlyBehavior
{
void Fly();
}
interface QuackBehavior
{
void Quack();
}
// классы, реализующие типы полёта
class FlyWithWings : FlyBehavior
{
public void Fly()
{
Console.WriteLine("машет крыльями!");
}
}
class Flightless : FlyBehavior
{
public void Fly()
{
Console.WriteLine("я не умею летать :(");
}
}
class JetPack : FlyBehavior
{
public void Fly()
{
Console.WriteLine("использует реактивный ранец");
}
}
// классы, реализующие типы кряканья
class UsualQuack : QuackBehavior
{
public void Quack()
{
Console.WriteLine("кря-кря!");
}
}
class Squeak : QuackBehavior
{
public void Quack()
{
Console.WriteLine("пиип-пиип!");
}
}
class SilentSqueak : QuackBehavior
{
public void Quack()
{
Console.WriteLine("* звук сверчка *");
}
}
// базовый абстрактный класс уток
abstract class Duck
{
protected FlyBehavior? flyBehavior;
protected QuackBehavior? quackBehavior;
public virtual void Swim()
{
Console.WriteLine("все утки плавают!");
}
public abstract void Display();
public void PerformFly()
{
flyBehavior?.Fly();
}
public void PerformQuack()
{
quackBehavior?.Quack();
}
public void SetFlyBehavior(FlyBehavior newFlyBehavior)
{
flyBehavior = newFlyBehavior;
}
public void SetQuackBehavior(QuackBehavior newQuackBehavior)
{
quackBehavior = newQuackBehavior;
}
}
// конкретные утки
class MallardDuck : Duck
{
public MallardDuck()
{
flyBehavior = new FlyWithWings();
quackBehavior = new UsualQuack();
}
public override void Display()
{
Console.WriteLine("mallard.jpg");
}
}
class RubberDuck : Duck
{
public RubberDuck()
{
flyBehavior = new Flightless();
quackBehavior = new Squeak();
}
public override void Display()
{
Console.WriteLine("rubber.jpg");
}
}
class DecoyDuck : Duck // деревянная утка-манок
{
public DecoyDuck()
{
flyBehavior = new Flightless();
quackBehavior = new SilentSqueak();
}
public override void Display()
{
Console.WriteLine("decoy.jpg");
}
}
class Program
{
static void Main()
{
Console.WriteLine("Решение # 2");
Duck duck = new MallardDuck();
duck.PerformFly();
duck.PerformQuack();
duck.Swim();
// duck.Display();
Console.WriteLine();
duck = new RubberDuck();
duck.PerformFly();
duck.PerformQuack();
// duck.Swim();
Console.WriteLine();
duck = new DecoyDuck();
duck.PerformFly();
duck.PerformQuack();
// duck.Swim();
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